用于显示Winform的Show和ShowDialog的模糊方法

本文关键字:ShowDialog 模糊 方法 Show 显示 Winform 用于 | 更新日期: 2023-09-27 18:12:33

我在ShowShowDialog显示/显示Windows窗体的方法之间挣扎。我一般使用show方法而不是ShowDialog方法。当我不想在ALT+TAB工具窗口显示表单时,使用ShowDialog方法。

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 companyID=@companyID" +
                     " and transID=@transID" +
                     " 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 companyID=@companyID" +
                     " and transID=@transID";
        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 Form上的Show()方法调用Purchase_Binding()方法工作得很好,但是如果我在ShowDialog()方法中使用相同的方法,那么它将显示记录,但控件的对齐方式发生了变化。这意味着我必须在ShowDialog()方法中显示的实例上发出每个控件大小、高度、宽度和companyID的新值。

如果是这样,那么它将为我工作,因为我必须在ShowDialog()方法上重新设计purchase_Entry。

什么是最好的方法?如果我处理Show()方法,那么表单将显示在ALT+TAB工具窗口,我不想允许在ALT+TAB工具窗口显示它。这就是为什么我使用ShowDialog()方法,它将显示为模型窗口表单,而不会显示在ALT+TAB工具窗口。

如果我使用ShowDialog()方法,那么我必须准备好重新设计它,就像驴工作一样。不是吗?

用于显示Winform的Show和ShowDialog的模糊方法

尝试改变调用的顺序。

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

在使用ShowDialog时看不到moto调用效果的原因是,ShowDialog阻塞了当前正在执行的线程,直到窗体关闭,这意味着在窗体关闭之前不会调用方法moto。

希望这对你有帮助

这是你的默认构造函数,根据输入设置更多

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

根据需要调用并传入值,您可以将进一步的处理封装在不同的方法中并进行调用。

加载新表单只在ShowDialog()之后执行

表单。ShowDialog以模态模式显示表单。这意味着代码在表单下面。当窗体打开时,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之前初始化Id。

使用Form2类中的公共属性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();
}