【问题标题】:Passing multiple rows from gridview in form1 to form2 and wait for a button click将多行从form1中的gridview传递到form2并等待按钮单击
【发布时间】:2018-12-31 19:15:40
【问题描述】:

在进行一些更改后,我有这段代码将多行从 form1“FrmPaint”中的 gridview 传递到 form2“OptionsPaint”,然后将此数据传递给 form1“FrmPaint”中的 gridview2

OptionsPaint OPaint = new OptionsPaint();        
    private void btnAdd_Click(object sender, EventArgs e)
    {
        int[] selectedRows = gridView1.GetSelectedRows();
        for (int i = 0; i < selectedRows.Length; i++)
        {
            DataRow rowGridView1 = (gridView1.GetRow(selectedRows[i]) as DataRowView).Row;
            if (OPaint == null || OPaint.IsDisposed)
            OPaint = new OptionsPaint();
            OPaint.Show();

            OPaint.bsRepere.Text = rowGridView1["BS"].ToString() + " " + "Repère: " + rowGridView1["Repère"].ToString();
            OPaint.quantity.EditValue = rowGridView1["Reste Qté"];

            OPaint.OK.Click += (sender1, e1) =>
             {
                 DataRow row = dt.NewRow();
                 row[0] = rowGridView1["BS"];
                 row[1] = rowGridView1["Repère"];
                 row[2] = rowGridView1["Profil"];
                 row[3] = OPaint.quantity.EditValue;
                 dt.Rows.Add(row);
               OPaint.Close();
            }; 
         }
     }

当我只选择一行时,代码可以正常工作,但是当我选择多行时 form2“OptionsPaint”仅显示一次,从 from1 中选择 gridview 中的最后一个值。有没有办法停止代码,直到用户单击按钮然后完成其余代码。

【问题讨论】:

  • 使用 DataView 几乎是微不足道的,其中底层数据表中的 bool 列控制一行应显示在哪个表单/DGV 中
  • 我曾经将此代码与 layoutcontrol 一起使用,并且适用于单行和多行,但是当我使用 form (form2) 时,它们不适用于多行

标签: c# winforms devexpress


【解决方案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 次:第一次运行时,如果 OptionsForm of 未显示,则会显示。在已经可见的表单上反复调用 Show() 不会执行任何操作。

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

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

那该怎么办呢?

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

var dResult = OPaint.ShowDialog();

您需要做一些额外的设置才能将表单用作对话框,因为您需要声明哪个按钮是确定,哪个是取消。请参阅 MSDN https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.form.dialogresult?view=netframework-4.7.2 中的此示例 - 设置确定/取消按钮的 .dialogresult 并告诉表单是接受/取消。从按钮单击处理程序中删除对 Close() 的指令 - 控制对话框类型表单的按钮会导致表单在被单击时自动关闭

您需要一个 if 来测试 dResult 以了解用户是单击确定还是取消,并进行相应处理 - 我不知道如果他们单击取消您会做什么?

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

最后,我只想指出,这样做的用户界面非常烦人。您应该考虑只使用一个对话框询问“可以更新所有这 10 行吗?”或者可能有一个可以同时显示和更新多个内容的表单

【讨论】:

  • @aius Jard,非常感谢你的帮助,关于显示一个对话框,每一行都有他的属性(数量,油漆类型)必须单独设置
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 2015-05-19
  • 1970-01-01
相关资源
最近更新 更多