Неадназначнасць Метад Show і ShowDialog для адлюстравання Winform

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_Binding() метад з <моцны> purchase_Entry Форма на <моцны> Show() метад працуе вельмі добра, але калі я выкарыстоўваю той жа на <моцны > ShowDialog() метад, то ён будзе адлюстроўваць запісу, але выраўноўванне элементаў кіравання змяняюцца. Гэта азначае, што я павінен выдаць новае значэнне кожнага памеру кіравання, вышыня, шырыня і CompanyID на экзэмпляры, паказваючы на ​​<моцны> ShowDialog() метад.

Калі гэта так, то гэта будзе асёл працуе для мяне, таму што я павінен перапраектоўваць purchase_Entry на ShowDialog() метад.

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, гэта проста прыклад, я заўсёды супраць праходжання parametariz ў выглядзе канструкцыі, таму што гэта створыць праблему перагрузкі на кожны момант часу новага асобніка формы. і гэта толькі адно значэнне, тое, што адбудзецца, калі павінна быць больш, чым адно значэнне даступна на яго.
дададзена аўтар mahesh, крыніца
@ V4Vendetta, Глядзіце мой адрэдагаваны пытанне.
дададзена аўтар mahesh, крыніца
Чаму вы ініцыялізаваць Label1 ў метадзе Form_Load? Ці не можа гэта зрабіць у канструктару? Праблема вы выпрабоўваеце проста як 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, Глядзіце маю праўку, папярэднія адзін невялікі прыклад маёй рэальнай праблемы, як апісана вышэй.
дададзена аўтар mahesh, крыніца
@tafa, Глядзіце мой адрэдагаваны пытанне для разгляду
дададзена аўтар mahesh, крыніца
@ V4Vendetta, тут дадатковыя сродкі доступу Предположат, калі ў мяне ёсць значэнне ідэнтыфікатара на form2 і мой метад залежыць ад ID значэння, чым калі б я змяніць парадак ShowDialog, чым ён будзе кідаць памылку аб пустым значэнні ID.
дададзена аўтар mahesh, крыніца
Гэта праўда, што змяненне парадку выклікаў будзе вырашаць праблемы. але гэта не будзе дазволена далейшым доступ form2. і я хачу futher доступ 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, крыніца
На самай справе я супраць праязджаюць paramaterized ў выглядзе будаўніцтва. таму што гэта не добрая ідэя выкарыстоўваць.
дададзена аўтар mahesh, крыніца

Form.ShowDialog паказаць форму ў мадальнасці рэжыме. Гэта азначае, што код ніжэй Form.ShowDialog ніколі не будзе выконвацца, пакуль форма адкрыта.

У вашым выпадку, калі ваш метад залежыць ад ID, вы павінны ініцыялізаваць ідэнтыфікатар перад вы называеце f2.moto (), напрыклад, Перад 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();
}

<Моцны> EDIT:

Калі вы не выкарыстоўваеце параметризованную форму канструктара вы таксама павінны ініцыялізаваць Id перад выклікам ShowDialog.

Выкарыстоўвайце Id грамадскай маёмасці ў класе Form2:

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
дададзена
Выбачайце, але я супраць праязджаюць paramterized ў выглядзе будаўніцтва. гэта не добрая ідэя тут.
дададзена аўтар mahesh, крыніца
Глядзіце мой новы Edit, якая з'яўляецца рэальнай праблемай.
дададзена аўтар mahesh, крыніца
Але як ёсць ствараць праблемы, я не ведаю, як мець справу з абодвума метадам
дададзена аўтар mahesh, крыніца
... Калі гэта так, чым метад Show() лепш, чым ShowDialog. Але Паказаць метад таксама стварае праблему, паказваючы на ​​ALT + TAB ToolWindow. Дзе, як ShowDialog не адлюстроўваюцца на ALT + TAB. Вось чаму я спрабую даведацца, што які метад лепш
дададзена аўтар mahesh, крыніца
... Калі шматлікія элементы кіравання Form2 востраць з кожнай іншыя вышыні і шырыні, чым я павінен выдаць новае значэнне для таго ж. ці не так?.
дададзена аўтар mahesh, крыніца
Чым я павінен задаць адзін каштоўны пытанне адносна таго ж і пытанне: Калі я іду з ShowDialog, чым я павінен перадаць кожнае значэнне параметру на экзэмпляры формы?. Калі form2 мае кантроль і многія ідэнтыфікатар, чым я павінен зноў прайсці для таго ж?.
дададзена аўтар mahesh, крыніца
Я заблытаць можа рэдагаваць свае каментары ў свой арыгінальны адказ з падрабязнай інфармацыяй
дададзена аўтар mahesh, крыніца
Такім чынам, вы можаце ініцыялізаваць ідэнтыфікатар з дапамогай іншых метадаў. Напрыклад, пры выкарыстанні грамадскай маёмасці Id у Form2. Ці вы можаце стварыць ShowAndInitId публічнага метаду (ідэалам ідэнтыфікатар) {Label1.Text = id.ToString (); ShowDialog ();} І гэты метад выклікаецца замест f2.ShowDialog ();
дададзена аўтар Victor Chekalin, крыніца