假设我们有两种形式。 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的行有什么问题。
答案 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为示例提供的链接。