与ShowDialog()连接的表格

时间:2017-02-28 10:19:10

标签: c# ms-access

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

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的行有什么问题。

2 个答案:

答案 0 :(得分:2)

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

使用如下代码:

Form1中:

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从主窗体传递数据。

答案 1 :(得分:0)

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