使用 ShowDialog() 连接表单

Posted

技术标签:

【中文标题】使用 ShowDialog() 连接表单【英文标题】:Connected Forms with ShowDialog() 【发布时间】:2017-02-28 10:19:09 【问题描述】:

假设我们有两种形式。 form1 使用 ShowDialog() 函数调用 form2。只有在 form2 关闭后才能在 form1 中运行代码的最佳方法是什么? 实际上,我想使用来自form2 的数据填充form1 中的数据网格视图。

void frmAnalysis_Activated(object sender, EventArgs e)
    
        //I am using this event to add rows
        if (selectedEXP.Count != 0)
        
            dgvExperiments.Rows.Clear();
            foreach (SelectedExperiments s in selectedEXP)
            
                for (int i = 0; i < s.size; i++)
                
                    int index = dgvExperiments.Rows.Add();
                    dgvExperiments.Rows[index].Cells["Experiment"].Value = s.name;
                
            
        
    




#region Update database
//and here is a code to update data but the problem that the 
// foreach loop is skipped since there is no rows in dgvExperiments
// however I can see a row when the form is Active
        if(dgvExperiments.Rows.Count >0)
        
            MessageBox.Show("True");
        
        try
         int k = 0;
            OleDbDataAdapter da;
            da = new OleDbDataAdapter("select * from [AnalysisExperiments]", conn);
            string ExpQuery = "update AnalysisExperiments set SampleNumber = @SampleNumber, Status = @Status where ID = '" + tbJobNumber.Text + "' and Experiment = '";

            foreach (DataGridViewRow row in dgvExperiments.Rows)
            
                ExpQuery = ExpQuery + row.Cells["Experiment"].Value.ToString() + "'";
                OleDbCommand updateCommand = new OleDbCommand(ExpQuery, conn);
                updateCommand.Parameters.Add("@SampleNumber", OleDbType.VarWChar);                    
                updateCommand.Parameters["@SampleNumber"].Value = row.Cells["SampleNumber"].Value.ToString();
                updateCommand.Parameters.Add("@Status", OleDbType.Boolean);
                updateCommand.Parameters["@Status"].Value = row.Cells["Status"].Value;
                da.UpdateCommand = updateCommand;

                conn.Open();
                k = da.UpdateCommand.ExecuteNonQuery();
                conn.Close();
            

            if (k == 1)
                MessageBox.Show("Done");
            else
            
                MessageBox.Show("Nothing Updated!");
            
        
        catch(Exception ex)
        
            MessageBox.Show(ex.Message);
        
        #endregion

我正在尝试更新一些数据,但我不知道 dgvExperiments 的行有什么问题。

【问题讨论】:

Send values from one form to another form的可能重复 我留下了答案,将SomeFunction 替换为以数据为参数并填充数据网格视图的函数。并在调用时替换。 如果您调用 ShowDialog(),Form1 将等待 form2。否则,您可以设置自己的事件,该事件会在 form2 关闭时触发。 @MohammedAl-A'mri 如果您在填写 datagridview 时遇到问题,请在此处发布该代码,以便我查看。 这是一个大的):但我会发布它@EpicKip 【参考方案1】:

这是一个说明如何操作的示例,将数据和函数替换为您的实际数据和函数。

使用如下代码:

表格1:

public partial class Form1 : Form

    public Form1()
    
        InitializeComponent();
    

    private void button1_Click(object sender, EventArgs e)
    
        Form2 form2 = new Form2(this);
        form2.ShowDialog();

    

    public void SomeFunction(string someData)
    
        dataGridView1.Rows.Clear();
        foreach(string data in someData)
        
            dataGridView1.Rows.Add(data);
        
    

正如您在此处看到的,我使用this 作为new Form2 的参数 表格2:

public partial class Form2 : Form

    Form1 MainForm;
    public Form2(Form1 form)//This is why you need to give "this" as parameter
    
        InitializeComponent();
        MainForm = form;
    

    private void button1_Click(object sender, EventArgs e)
    
        //Here you call your function and send the data to fill the DataGridView
        List<string> listOfData = new List<string> "someDataA", "someDataB";
        MainForm.SomeFunction(listOfData);
        this.Close();
    

如您所见,参数在这里:public Form2(Form1 form) 在那里,我们使其在类MainForm = form 中可访问,然后在某个操作(在我的情况下单击按钮)之后,我们从主窗体调用SomeFunction 并传递数据一起来。

【讨论】:

看不到Form2 form2 = new Form2(this); 需要this 的原因或者它对他有什么好处,但无论如何都赞成,也许你可以详细说明一下? this 在此示例中表示 Form1,因此我将 Form1 发送到 form2,这样我就可以从 form2 访问其方法而无需创建新实例(如果您创建新实例,它将无法更新 UI因为你想改变现有的实例) @Joel 确切地说,this 是对其调用的类的实例的引用。我更新了我的答案,也许这会清除它:) 它运行正确但网格视图行没有出现 为 datagridview 行显示你的代码...没有它我无法判断出什么问题【参考方案2】:

如果您使用 ShowDialog(),Form1 中代码的执行将“停止”,直到 Form2 关闭。我猜这就是你想要的。 如果你有例如Form2 中的公共属性,您可以在 Form2 关闭后从 Form1 访问数据。 查看 JohnG 提供的示例链接。

【讨论】:

以上是关于使用 ShowDialog() 连接表单的主要内容,如果未能解决你的问题,请参考以下文章

使用 ShowDialog 打开的表单在异常后关闭

从 TabControl 拖动时出现表单 ShowDialog 问题

使用 form.ShowDialog() 时,主窗体中的线程不起作用

如何以 ShowDialog() 形式打开表单;我第一次打开表单但 Show();我第二次打开同一个表格

在 Task ContinueWith TaskScheduler.FromCurrentSynchronizationContext 的 ShowDialog 中打开表单时,应用程序会冻结

子表单连接,主/子,引用表单控件或使用查询连接,哪个更可取