【问题标题】:Connected Forms with ShowDialog()使用 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 的行有什么问题。

【问题讨论】:

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

标签: c# ms-access


【解决方案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 提供的示例链接。

【讨论】:

    猜你喜欢
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2011-06-28
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多