Winform Görüntülemek İçin Göstermek ve Göstermek İçin Belirsiz Yöntem

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 yöntemi, normal pencere formundan sınırlı erişime sahip olan model pencere formunu gösterir. Model penceresi formu, kontrolün değerine ve normal pencere formuna geçmiş olan nesneye erişmiyor. Bu nedenle, her zaman veya yeni bir form örneğinin her zaman için yeni bir değer vermemiz gerekir ki bu gerçek bir örnektir.

//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);

         }
     }

Göster() yöntemindeki Purcha_Entry formundaki Purchase_Binding() yöntemini çağırmak çok iyi çalışıyor, ancak aynı şeyi ShowDialog() yöntemini kullanarak kayıtları görüntüleyecektir, ancak denetimlerin hizalaması değiştirilecektir. Bu, ShowDialog() yönteminde gösterilen örnekte her bir kontrol boyutu, yükseklik, genişlik ve şirket kimliği için yeni bir değer vermek zorunda olduğum anlamına gelir.

Eğer öyleyse, o zaman eşek benim için çalışacaktır, çünkü ShowDialog() yönteminde purchase_Entry öğesini yeniden tasarlamak zorundayım.

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.

Ve eğer ShowDialog() yöntemini kullanırsam, ben de eşek gibi çalışır gibi yeniden tasarlamaya hazır olmalıyım. Öyle değil mi?

2
@tafa, Bu Sadece Örnek, her zaman parametariz'i form inşasına geçirmekten alıkoyacağım, çünkü her yeni form örneğinde aşırı yüklenme problemi yaratacaktır. ve sadece bir değerdir, üzerinde birden fazla değer bulunması durumunda ne olur.
katma yazar mahesh, kaynak
@ V4Vendetta, Düzenlenmiş sorumu inceleyin.
katma yazar mahesh, kaynak
Neden Label_Load yönteminde label1'i başlatıyorsunuz? Kurucuda yapılamaz mı? Yaşadığınız problem, V4Vendetta'nın işaret ettiği gibi basit.
katma yazar tafa, kaynak
Yapıcıya çağrı yöntemini alamaz mısın?
katma yazar V4Vendetta, kaynak
Ne yapmak istediğinizden emin değilsiniz, şimdi form_load, ShowDialog 'dan sonra çalıştırılacak ve böylece etiketiniz belirlenmeyecek, bu yüzden boş görünecektir.
katma yazar V4Vendetta, kaynak

3 cevap

Çağrıların sırasını değiştirmeyi deneyin.

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

ShowDialog kullanırken moto çağrı etkisini görmemenizin nedeni, ShowDialog form kapatılana kadar geçerli yürütme iş parçacığı engeller, yani motora form kapatılana kadar yöntem çağrılmaz.

1
katma
@tafa, Yeni düzenlemeye bak, bir önceki, yukarıdaki gibi asıl sorununun küçük örneğidir.
katma yazar mahesh, kaynak
@tafa, Değerlendirmeniz için benim düzenlenmiş soruma bakın
katma yazar mahesh, kaynak
@ V4Vendetta, Burada daha fazla erişim varsayalım form2 üzerinde bir ID değeri varsa ve yöntemim IDD değerine bağlı olduğundan daha az IDD değerine bağlı olduğundan, boş ID değeri ile ilgili hata atar.
katma yazar mahesh, kaynak
Çağrıların sırasını değiştirmenin problemleri çözeceği doğrudur. Ancak, form2'nin daha fazla erişmesine izin verilmeyecektir. ve ben form2'nin daha fazla erişilmesini istiyorum, bu nedenle siparişi değiştiremiyorum.
katma yazar mahesh, kaynak
Daha fazla erişim ile ne demek istiyorsun?
katma yazar V4Vendetta, kaynak

Umarım bu size yardımcı olabilir

Bu, varsayılan yapıcınızdır, girdilere göre daha fazlasını yapın

public Form2()
{
   InitializeComponent();
}

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

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

Aramayı istediğiniz gibi yapın ve değeri iletin, farklı işlemlerde daha fazla işlem yapabilir ve çağrı yapabilirsiniz.

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

0
katma
Yeni düzenlememe bakın, gerçek sorun
katma yazar mahesh, kaynak
Ben ShowDialog() Yöntemi sınırlı bir erişim özel bir formun belirli bir şekilde Show() yöntemine sahip olduğunu düşünüyorum
katma yazar mahesh, kaynak
Aslında form yapımına paramaterize edilmeye karşıyım. çünkü kullanmak için iyi bir fikir değildir.
katma yazar mahesh, kaynak

Form.ShowDialog, formu modda gösterir. Form açılırken Form.ShowDialog hiçbir zaman kod yürütülmeyeceği anlamına gelir.

Durumunuzda, yönteminiz kimliğe bağlıysa, f2.moto() adını verdiğiniz kimliğini başlatmanız gerekir. ShowDialog'dan önce.

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();
}

DÜZENLEME:

Eğer parametrized form kurucusu kullanmıyorsanız, ShowDialog'u aramadan önce init ID'sini de girmelisiniz.

Form2 sınıfındaki public property kimliğini kullanın:

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
katma
Üzgünüm ama form yapımında parametrelenerek geçişe karşıyım. burada iyi bir fikir değil.
katma yazar mahesh, kaynak
Asıl konu olan yeni Düzenleme'ye bakın.
katma yazar mahesh, kaynak
Ama her ikisi de problem yaratıyor, her iki yöntemle nasıl başa çıkacağımı bilmiyorum
katma yazar mahesh, kaynak
... Show() yönteminden öte, ShowDialog'dan daha iyidir. Ancak Show yöntemi, ALT + TAB ToolWindow'da da gösterme sorunu yaratır. ShowDialog nerede ALT + SEKME'de görünmüyor. Bu yüzden hangi yöntemin daha iyi olduğunu bilmeye çalışıyorum
katma yazar mahesh, kaynak
... Eğer form2'nin birçok kontrolü, birbirinin boyu ve genişliğiyle ayarlanırsa, bunun için yeni bir değer vermek zorundayım. sağ?.
katma yazar mahesh, kaynak
Aynı soruyla ilgili bir soru sormalıyım ve soru şudur: Eğer showdialog ile gidersem form parametresi üzerinde her bir parametre değerini geçmek zorundayım? Eğer form2 kontrolüne sahipse ve aynı şey için tekrar geçmek zorunda olduğumdan daha fazla id var mı?
katma yazar mahesh, kaynak
Şüpheliyim, yorumlarınızı orijinal cevabınıza ayrıntılarıyla düzenleyebilir misiniz
katma yazar mahesh, kaynak
Böylece diğer yöntemleri kullanarak kimlik girebilirsiniz. Örneğin, Form2'de public property Id'yi kullanma. Veya public method ShowAndInitId (int id) {label1.Text = id.ToString (); ShowDialog ();} Ve bu yöntemi yerine f2.ShowDialog ();
katma yazar Victor Chekalin, kaynak