【问题标题】:How to set Textbox.Enabled from false to true on TextChange?如何在 TextChange 上将 Textbox.Enabled 从 false 设置为 true?
【发布时间】:2015-12-13 10:36:47
【问题描述】:

我以编程方式创建一个Form 和两个textboxes。我的目标是禁用一个textbox,如果我在第二个中输入一些内容并且相反。我设法在第一个 textbox textchange 上禁用了第二个 textbox,但无法弄清楚当第一个 textbox.Text 为空时如何启用它。

代码如下:

private void metaName_TextChanged(object sender,EventArgs e)
    {
        var ctrl = (Control)sender;
        var frm = ctrl.FindForm();

        TextBox metaTxt = null;
        foreach (var ctr in frm.Controls)
        {
            if (ctr is TextBox)
            {
                metaTxt = (TextBox)ctr;
                if (metaTxt.Name == "metaHTTPEquiv")
                {
                    metaTxt.Enabled = false;
                }
                else
                    if (?)
                    {

                    }
            }
        }
    }

我想做这样的东西:

if(textBox3.Text == String.Empty)
        {
            textBox4.Enabled = true;
        }
        else
            if(textBox3.Text != String.Empty)
        {
            textBox4.Enabled = false;
        }

【问题讨论】:

  • 那么问题出在哪里?没用?
  • 第二个代码在表单中使用,在 Designer 中创建,不是以编程方式。它只是代表我以编程方式创建表单时想要做的事情

标签: c# winforms dynamic


【解决方案1】:

您只能检查每个事件的 textchanged 事件,如下所示:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    textBox2.Enabled = !(textBox1.Text.Length >= 1);
}

private void textBox2_TextChanged(object sender, EventArgs e)
{
    textBox1.Enabled = !(textBox2.Text.Length >= 1);
}

self 文本框有一些值,然后启用的将为另一个为 false

【讨论】:

    【解决方案2】:

    首先根据引发事件的 metaName 文本框的内容设置一个标志来启用或禁用第二个控件,然后使用一点 Linq 搜索第二个文本框。

    private void metaName_TextChanged(object sender,EventArgs e)
    {
        TextBox ctrl = sender as TextBox;
        if(ctrl != null)
        {
             bool enable = !string.IsNullOrEmpty(ctrl.Text);
             TextBox secondOne = this.Controls
                           .OfType<TextBox>()
                           .FirstOrDefault(x => x.Name == "metaHTTPEquiv");
            if(secondOne != null)
               secondOne.Enabled = enable;
        }
    }
    

    相同的代码,颠倒文本框的角色,可以用作第二个文本框的事件处理程序。

    【讨论】:

      【解决方案3】:

      忘记控制事件并使用数据绑定

      采取以下辅助方法

      static void Bind(Control target, string targetProperty, object source, string sourceProperty, Func<object, object> expression)
      {
          var binding = new Binding(targetProperty, source, sourceProperty, true, DataSourceUpdateMode.Never);
          binding.Format += (sender, e) => e.Value = expression(e.Value);
          target.DataBindings.Add(binding);
      }
      

      只需在表单加载事件中添加类似的内容

      Bind(textBox2, "Enabled", textBox1, "Text", value => string.IsNullOrEmpty((string)value));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-22
        • 1970-01-01
        • 2021-09-28
        • 2022-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多