使用 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() 连接表单的主要内容,如果未能解决你的问题,请参考以下文章
从 TabControl 拖动时出现表单 ShowDialog 问题
使用 form.ShowDialog() 时,主窗体中的线程不起作用
如何以 ShowDialog() 形式打开表单;我第一次打开表单但 Show();我第二次打开同一个表格
在 Task ContinueWith TaskScheduler.FromCurrentSynchronizationContext 的 ShowDialog 中打开表单时,应用程序会冻结