Winformを表示するためのShowとShowDialogのあいまいなメソッド

I am struggling between Show and ShowDialog method of Showing/Display of Windows Forms. I generally use the show method instead of the ShowDialog method. And the ShowDialog method is used when I don’t want to show the forms at ALT+TAB ToolWindow.

ShowDialog メソッドは、通常のウィンドウフォームよりアクセスが制限されているモデルウィンドウフォームを表示します。モデルウィンドウフォームは、コントロールと、通常のウィンドウフォームで既に渡されたオブジェクトの値にアクセスしていません。したがって、実際の例であるフォームの新しいインスタンスが毎回または毎回、新しい値を提供する必要があります。

//Purchase_Entry having a public method which is calling from form30 as under:

public partial class purchase_Entry : Form
{
    public purchase_Entry()
    {
        InitializeComponent();
    }

    public void Purchase_Binding()
    {
        mydgv.Location = new Point(0, 110);
        mydgv.RowHeadersVisible = false;
        mydgv.Width = panel2.Width;
        mydgv.Height = panel2.Height - 220;
        mydgv.TabIndex = 4;

        string connstr = "server=.;initial catalog=maa;uid=mah;pwd=mah";
        SqlConnection con = new SqlConnection(connstr);
        con.Open();

        string sql = @"select billno,date=convert(varchar,date,103),ledgeraccount,totcts,rround,grosspurchase,taxes,taxamt,totdb,narrat" +
                     " from depurchasea where [email protected]" +
                     " and [email protected]" +
                     " group by billno,date,ledgeraccount,totcts,rround,grosspurchase,taxes,taxamt,totdb,narrat" +
                     " order by date,billno";

        SqlCommand cmd = new SqlCommand(sql, con);
        cmd.Parameters.AddWithValue("companyID", label6.Text);
        cmd.Parameters.AddWithValue("transID", textBox5.Text);
        SqlDataAdapter dap = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        dap.Fill(ds);
        for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
        {
            textBox2.Text       = Convert.ToString(ds.Tables[0].Rows[i]["billno"]);
            maskedTextBox1.Text = Convert.ToString(ds.Tables[0].Rows[i]["date"]);
            textBox1.Text       = Convert.ToString(ds.Tables[0].Rows[i]["ledgeraccount"]);
            textBox9.Text       = Convert.ToString(ds.Tables[0].Rows[i]["totcts"]);
            textBox7.Text       = Convert.ToString(ds.Tables[0].Rows[i]["rround"]);
            textBox13.Text      = Convert.ToString(ds.Tables[0].Rows[i]["grosspurchase"]);
            comboBox1.Text      = Convert.ToString(ds.Tables[0].Rows[i]["taxes"]);
            textBox8.Text       = Convert.ToString(ds.Tables[0].Rows[i]["taxamt"]);
            textBox6.Text       = Convert.ToString(ds.Tables[0].Rows[i]["totdb"]);
            textBox3.Text       = Convert.ToString(ds.Tables[0].Rows[i]["narrat"]);
        }

        //mydgv.Columns.Clear();

        string MySQL = "select srno,particulars,carats,rate,debit from depurchasea" +
                     " where [email protected]" +
                     " and [email protected]";
        SqlCommand mycmd = new SqlCommand(mysql, con);
        mycmd.Parameters.AddWithValue("companyID", label6.Text);
        mycmd.Parameters.AddWithValue("transID", textBox5.Text);
        SqlDataAdapter mydap = new SqlDataAdapter(mycmd);
        DataSet myds = new DataSet();
        mydap.Fill(myds);
        mybinding = new BindingSource();
        mybinding.DataSource = myds;
        mybinding.DataMember = myds.Tables[0].TableName;
        mydgv.DataSource = mybinding;

        mydgv.Columns[0].HeaderText = "Sr.No.";
        mydgv.Columns[1].HeaderText = "Particulars";
        mydgv.Columns[2].HeaderText = "Carats";
        mydgv.Columns[3].HeaderText = "Rate";
        mydgv.Columns[4].HeaderText = "Amount";

        mydgv.Columns[0].Width = 50;
        mydgv.Columns[1].Width = 500;
        mydgv.Columns[4].Width = 100;
        mydgv.Columns[2].Width = 100;
        mydgv.Columns[3].Width = 100;

        mydgv.Columns[2].DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomRight;
        mydgv.Columns[3].DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomRight;
        mydgv.Columns[4].DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomRight;
        mydgv.Columns[2].DefaultCellStyle.Format = "f2";
        mydgv.Columns[3].DefaultCellStyle.Format = "f2";
        mydgv.Columns[4].DefaultCellStyle.Format = "f2";
        mydgv.Columns[4].ReadOnly = true;

        int dgvsize = mydgv.Width/17;
        mydgv.Columns[0].Width = dgvsize;
        mydgv.Columns[1].Width = dgvsize * 10;
        mydgv.Columns[2].Width = dgvsize * 2;
        mydgv.Columns[3].Width = dgvsize * 2;
        mydgv.Columns[4].Width = dgvsize * 2;
        mydgv.Refresh();

        if (textBox13.Text != "")
        {
            decimal res = Convert.ToDecimal(textBox13.Text);
            textBox13.Text = res.ToString("f2");
        }
    }

public partial class Form30 : Form
{
    public Form30()
    {
        InitializeComponent();
    }

    private void listView1_KeyPress(object sender, KeyPressEventArgs e)
    {


        else if (textBox2.Text == "Purchase")
        {
             purchase_Entry pc = new purchase_Entry();
             pc.lbl6.Text  = pp.Form1.IDD.Text; //companyID
             pc.Purchase_Binding() //Calling public method of purchase_entry Class
             pc.ShowDialog(this);
             pc.textboxKeypress += new purchase_Entry.Action(pc_textboxKeypress);
             pc.purkeydown += new purchase_Entry.Action(pc_purkeydown);

         }
     }

purchase_Entry フォームの Show()メソッドの呼び出し Purchase_Binding()メソッドはうまくいきますが、 > ShowDialog()メソッドを呼び出すと、レコードが表示されますが、コントロールの配置が変更されます。これは、 ShowDialog()メソッドで表示されているインスタンスで、各コントロールのサイズ、高さ、幅、および会社IDの新しい値を発行する必要があることを意味します。

そうであれば、私は ShowDialog()メソッドでpurchase_Entryを再設計する必要があるため、ロバートは私のために働きます。

What is the best way?. If I deal with the Show() method then the form will show at ALT+TAB ToolWindow, and I don't want to allow to show it at ALT+TAB ToolWindow. That's why I used the ShowDialog() method which will show as a model window form and will not be displaying at ALT+TAB ToolWindow.

また、 ShowDialog()メソッドを使用すると、ロバのように再設計する準備ができている必要があります。それじゃない?

2
@tafa、それは単なる例です。フォームの新しいインスタンスのたびにオーバーロードの問題が発生するので、私はフォーム構築にパラメタリを渡すことに常に反対しています。それは1つの値だけです。複数の値が利用可能な場合はどうなりますか。
追加された 著者 mahesh,
@ V4Vendetta、私の編集した質問を参照してください。
追加された 著者 mahesh,
なぜForm_Loadメソッドでlabel1を初期化するのですか?コンストラクタではできませんか? V4Vendettaが指摘するように、あなたが経験している問題は簡単です。
追加された 著者 tafa,
あなたはコンストラクタを呼び出すことはできませんか?
追加された 著者 V4Vendetta,
あなたが何をしたいのか分からないので、form_loadは ShowDialog の後にのみ実行されるので、ラベルは設定されていないので空白になります
追加された 著者 V4Vendetta,

3 答え

通話の順序を変更してみてください。

private void button1_Click(object sender, EventArgs e)
{
    Form2 f2 = new Form2();
    f2.moto();
    f2.ShowDialog();
}

ShowDialogを使用するときにモトコールの効果が表示されない理由は、フォームが閉じられるまで、ShowDialogは現在の実行スレッドをブロックします。これは、フォームが閉じられるまでメソッドmotoが呼び出されないことを意味します。

1
追加された
@tafa、私の新しい編集を見て、前の1つは上記のような私の本当の問題の小さな例です。
追加された 著者 mahesh,
@tafa、あなたの検討のために私の編集された質問を見る
追加された 著者 mahesh,
@ V4Vendetta、ここでさらにアクセスとは、私がform2にID値を持っていて、私のメソッドがID値に依存していると仮定します。これは、showDialogの順序を変更するよりも空白のID値についてエラーを投げます。
追加された 著者 mahesh,
通話の順序を変更することで問題が解決されることは事実です。それ以上のフォーム2へのアクセスは許可されません。私はform2へのよりアクセスが欲しいので、私は注文を変更することができません。
追加された 著者 mahesh,
さらなるアクセスによって、あなたはどういう意味ですか?
追加された 著者 V4Vendetta,

これがあなたに役立つといい

これはあなたのデフォルトのコンストラクタです。

public Form2()
{
   InitializeComponent();
}

public Form2(int id)
{
    InitializeComponent();
    if(id == 101)
        textBox1.Text = "MAHESH";
}

public Form2(string name)
{
    InitializeComponent();    
    textBox1.Text = name;
}

必要に応じて呼び出しを行い、値を渡すと、別の方法で処理をカプセル化して呼び出しを行うことができます。

Load of the new form will only execute after ShowDialog()

0
追加された
私の新しい編集を見てください
追加された 著者 mahesh,
私はShowDialog()メソッドは、特定のフォームのShow()メソッドのアクセスを制限していると思う
追加された 著者 mahesh,
実際には、私はパラマティアライズされたフォームを構築することに反対しています。それは利用のための良い考えではないので。
追加された 著者 mahesh,

Form.ShowDialogはモーダルモードでフォームを表示します。フォームが開かれている間、Form.ShowDialogのコードは決して実行されません。

あなたのメソッドがIDに依存する場合は、f2.moto()を呼び出す前にIDを 初期化する必要があります。 ShowDialogの前に

public partial class Form2 : Form
{
    public Form2(int id)
    {
        InitializeComponent();
        label1.Text = id.ToString();
    }

    public void moto()
    {
        textBox1.Text = "MAHESH";
    }
}

private void button1_Click(object sender, EventArgs e)
{
    Form2 f2 = new Form2(101);
    f2.moto();
    f2.ShowDialog();
}

編集:

パラメータ化されたフォームコンストラクタを使用しない場合は、ShowDialogを呼び出す前にinit IDも設定する必要があります。

Form2クラスのpublicプロパティIdを使用します。

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    public void moto()
    {
        textBox1.Text = "MAHESH";
    }

    public int Id
    {
       set {label1.Text = value.ToString();}
    }
}

private void button1_Click(object sender, EventArgs e)
{
    Form2 f2 = new Form2();
    f2.Id = 101;
    f2.moto();
    f2.ShowDialog();
}
0
追加された
申し訳ありませんが、私はフォーム構築にパラメタイズされたことに反対しています。ここでは良い考えではありません。
追加された 著者 mahesh,
本当の問題である私の新しい編集を見てください。
追加された 著者 mahesh,
しかし、どちらも問題を作成している、私は両方の方法に対処する方法がわからない
追加された 著者 mahesh,
...そうなら、Show()メソッドはShowDialogより優れています。しかし、Showメソッドでも、Alt + Tab ToolWindowで表示するという問題が発生します。どこでShowDialogがAlt + Tabキーで表示されていないか。だからこそ私はどの方法が良いかを知ろうとしています
追加された 著者 mahesh,
...もしform2の多くのコントロールが、同じ値に対して新しい値を発行しなければならないよりも、それぞれの高さと幅で調整されているとします。右?。
追加された 著者 mahesh,
私は同じことに関して一つの貴重な質問をしなければなりません。問題は次のようなものです。私がshowdialogを使っているのであれば、フォームのインスタンスに各パラメータの値を渡す必要がありますか?もしform2がコントロールと多くのidを持っていたら、私は同じものをもう一度渡す必要がありますか?
追加された 著者 mahesh,
あなたのコメントをオリジナルの答えに編集することはできますか?
追加された 著者 mahesh,
ですから、他のメソッドを使ってinit idを指定することができます。たとえば、Form2のpublicプロパティIDを使用します。または、パブリックメソッドShowAndInitId(int id){label1.Text = id.ToString();}を作成できます。 ShowDialog();}代わりにこのメソッドを呼び出すf2.ShowDialog();
追加された 著者 Victor Chekalin,