C# 将多行从表格1中的gridview传递到表格2,并等待按钮单击
我有一段代码,它在将数据传递到表格1“FrmPaint”中的gridview之后,将多行从表格1“FrmPaint”中的gridview传递到表格2“OptionsPaint”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
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一样
最后,我只想指出,这样做的用户界面令人非常讨厌。你应该考虑只需要一个对话框