将值从文本框/单选按钮传递到一个TextBox

时间:2016-04-15 07:18:51

标签: c# winforms linq textbox

我有几个不同的单选按钮和四个文本框。

我想要实现的是从所有文本框中获取值并将其全部显示在一个摘要文本框中(摘要)。

我设法从所有单选按钮获取值但是我无法从文本框中获取值。

我希望看起来像这样:

  

RB1​​ - RB2 -RB3 - TXTB1 - TXTB2 - TXTB3 - TXTB4

单选按钮和文本框都在组框中。

private void summary_TextChanged(object sender, EventArgs e)
{
    var radios = this.Controls.OfType<GroupBox>().OrderBy(x => x.TabIndex)
       .SelectMany(x => x.Controls.OfType<RadioButton>())
       .Where(x => x.Checked == true)
       .Select(x => x.Text).ToList();

    this.summary.Text = string.Join("-", radios);

    var textboxes = this.Controls.OfType<GroupBox>().OrderBy(x => x.TabIndex)
        .SelectMany(x => x.Controls.OfType<TextBox>())
        .Select(x => x.Text).ToList();

    this.summary.Text = string.Join("-", textboxes);
}

1 个答案:

答案 0 :(得分:1)

最后一行用文本框的内容替换摘要文本框的内容,因此无线电按钮的内容丢失。
您需要做的是附加到上一个内容

 // Adding also a - to separate radiobuttons from textboxes
 this.summary.AppendText("-" + string.Join("-", textboxes));

此外,如果您已将此代码附加到summary TextChanged事件,则存在一个大问题,因为调用此代码时您更改了同一TextBox summary的内容,因此代码会自行调用。

通常,WinForms引擎足够智能以避免这种递归,但是您的代码会违反Form引擎的安全措施,因为您将summary内容更改了两次。

所以可能发生的事情是:

  1. 摘要为空,您以某种方式触发TextChanged事件
  2. 摘要设置为无线电文本,TextChanged事件被调用 再次
  3. 摘要设置为相同的广播文字,没有任何变化 WinForms引擎避免调用TextChanged事件处理程序
  4. 摘要设置为文本框文本(或新文本附加到上一个),TextChanged被调用
  5. 从第2点继续
  6. 不要将此代码添加为摘要文本框的事件处理程序,只需将其用作其他文本框TextChanged事件或RadioButtons检查事件的事件处理程序。

相关问题