C# 将多行从表格1中的gridview传递到表格2,并等待按钮单击

C# 将多行从表格1中的gridview传递到表格2,并等待按钮单击,c#,winforms,devexpress,C#,Winforms,Devexpress,我有一段代码,它在将数据传递到表格1“FrmPaint”中的gridview之后,将多行从表格1“FrmPaint”中的gridview传递到表格2“OptionsPaint” OptionsPaint-OPaint=新的OptionsPaint(); 私有void btnAdd_单击(对象发送者,事件参数e) { int[]selectedRows=gridView1.GetSelectedRows(); for(int i=0;i { DataRow row=dt.NewRow(); 行[0

我有一段代码,它在将数据传递到表格1“FrmPaint”中的gridview之后,将多行从表格1“FrmPaint”中的gridview传递到表格2“OptionsPaint”

OptionsPaint-OPaint=新的OptionsPaint();
私有void btnAdd_单击(对象发送者,事件参数e)
{
int[]selectedRows=gridView1.GetSelectedRows();
for(int i=0;i
{
DataRow row=dt.NewRow();
行[0]=rowGridView1[“BS”];
行[1]=rowGridView1[“Repère”];
行[2]=rowGridView1[“profile”];
第[3]行=opoint.quantity.EditValue;
dt.行。添加(行);
opoint.Close();
}; 
}
}
当我只选择一行时,代码工作正常,但当我选择多行时 form2“Options Paint”仅显示一次,最后一个值在gridview中从1中选择。是否有方法停止代码,直到用户单击按钮,然后完成其余代码。

以下是代码的等效功能:

//imagine it is a form with a single label and a button
OptionsForm of = new OptionsForm();

string[] sa = new string[]{ "a","b","c" };

foreach(string s in sa){
  of.Show();
  of.MyLabel.Text = s;
  of.MyButton.Click += (some event handler);
}
如果您有3个字符串,此代码循环将完全运行3次:第一次运行时,如果的
选项表单未显示,则它将显示。在已经可见的窗体上重复调用Show(),不会产生任何效果

然后在接下来的几毫秒内,标签文本将被更新3次(如此之快,您将看不到它,特别是当您的代码运行时,没有处理任何窗口消息),并且最终将被设置为“c”-您将永远看不到“a”或“b”。您的按钮单击事件将附加3个处理程序。我不完全确定这是否有帮助,尽管我怀疑没有,因为在你的例子中,它将把X行放在dt中,它们是相同的

这就是为什么当您选择多行时,只显示最后一行;每次循环传递都会覆盖上一个循环,并且没有任何东西会阻止循环在毫秒内运行到完成

那怎么办呢

如果希望此表单对每个选定的项目显示一次,那么如果用户选择了10个项目,则此表单将连续显示10次,他们必须单击10次才能将其删除,然后在附加按钮单击事件处理程序后将opoint.Show()移动到,并使其成为ShowDialog而不是Show:

var dResult = OPaint.ShowDialog();
要将表单用作对话框,还需要进行一些额外的设置,因为您需要声明哪个按钮是“确定”,哪个按钮是“取消”。请参阅MSDN中的示例-设置ok/cancel按钮的.Result对话框,并告诉表单它是accept/cancel。从按钮单击处理程序中删除关闭指令()-控制对话框类型窗体的按钮会在单击时自动关闭窗体

您需要一个if来测试dResult,以了解用户是否单击了OK或Cancel,并进行相应的处理-我不知道如果他们单击Cancel,您会怎么做

调用ShowDialog将导致代码在此点停止,直到用户做出决定,就像messagebox一样


最后,我只想指出,这样做的用户界面令人非常讨厌。你应该考虑只需要一个对话框,要求“更新所有这10行”,或者可能有一个窗体可以同时显示和更新多个事物

这相当于你的代码所做的事情:

//imagine it is a form with a single label and a button
OptionsForm of = new OptionsForm();

string[] sa = new string[]{ "a","b","c" };

foreach(string s in sa){
  of.Show();
  of.MyLabel.Text = s;
  of.MyButton.Click += (some event handler);
}
如果您有3个字符串,此代码循环将完全运行3次:第一次运行时,如果
选项表单未显示,则它将显示。在已经可见的窗体上重复调用Show(),不会产生任何效果

然后在接下来的几毫秒内,标签文本将被更新3次(如此之快,您将看不到它,特别是当您的代码运行时,没有处理任何窗口消息),并且最终将被设置为“c”-您将永远看不到“a”或“b”。您的按钮单击事件将附加3个处理程序。我不完全确定这是否有帮助,尽管我怀疑没有,因为在你的例子中,它将把X行放在dt中,它们是相同的

这就是为什么当您选择多行时,只显示最后一行;每次循环传递都会覆盖上一个循环,并且没有任何东西会阻止循环在毫秒内运行到完成

那怎么办呢

如果希望此表单对每个选定的项目显示一次,那么如果用户选择了10个项目,则此表单将连续显示10次,他们必须单击10次才能将其删除,然后在附加按钮单击事件处理程序后将opoint.Show()移动到,并使其成为ShowDialog而不是Show:

var dResult = OPaint.ShowDialog();
要将表单用作对话框,还需要进行一些额外的设置,因为您需要声明哪个按钮是“确定”,哪个按钮是“取消”。请参阅MSDN中的示例-设置ok/cancel按钮的.Result对话框,并告诉表单它是accept/cancel。从按钮单击处理程序中删除关闭指令()-控制对话框类型窗体的按钮会在单击时自动关闭窗体

您需要一个if来测试dResult,以了解用户是否单击了OK或Cancel,并进行相应的处理-我不知道如果他们单击Cancel,您会怎么做

调用ShowDialog将导致代码在此点停止,直到用户做出决定,就像messagebox一样

最后,我只想指出,这样做的用户界面令人非常讨厌。你应该考虑只需要一个对话框