【问题标题】:How can empty all textboxes by click when 1 check box is checked in C#在C#中选中1个复选框时如何通过单击清空所有文本框
【发布时间】:2011-10-13 14:07:52
【问题描述】:

在我的应用程序中,我有 85 个文本框。我的应用程序中的所有文本框都是这样的:

void textBox1s(string input)
{
    this.textBox1.ForeColor = Color.Black;
    this.textBox1.Text = input;
}

private void textBox1_MouseClick(object sender, MouseEventArgs e)
{
    textBox1s(Clipboard.GetText());
}

现在我想要任何文本框,当通过单击/鼠标单击 textbox1 上的复选框时,我想要任何文本框 >>>只有空的 textbox1.text 如果点击 textbox2 >>> 只有空的 textbox2.text 还有.....

在我的应用中,我有 tabControl1 和 18 groupbox

如何在文本框上单击/鼠标单击复选框为空时设置所有文本框?

如果我的答案是使用用户控制,请给我 1 个示例代码

谢谢。

【问题讨论】:

  • 应用程序的示例屏幕截图会很有帮助。您需要清除复选框选中/取消选中事件上的文本框还是仅清除文本框单击事件
  • 如果您的应用程序有 85 个文本框,那么您可能做错了什么。
  • @Ramhound 我认为他正在尝试自己构建一个 GridView

标签: c# visual-studio-2008


【解决方案1】:

不完全确定你的意思,但如果你想遍历文本框的集合,你可以这样做:

    foreach (Control cntrl in this.Controls)
    {
        if (cntrl is TextBox)
        {
            cntrl.Text = "lold";
        }
    }

其中“this”是类似于表单的容器

【讨论】:

    【解决方案2】:

    要重置文本,下面的这部分代码将重置任何被点击的文本框:

    首先声明事件委托

     private void AllTextBoxes_MouseClick(object sender, MouseEventArgs e)
            {
                if(sender is TextBox)
                    ((TextBox)(sender)).Text = "";
            }
    

    除了将其分配给每个文本框,您可以使用 VisualStudio 属性框通过选择所有文本框并分配它或手动为每个文本框执行此操作:

    this.textBox2.MouseClick += new System.Windows.Forms.MouseEventHandler(this.AllTextBoxes_MouseClick);
    

    或者在 FormLoad_Event 上你可以这样做

     foreach (Control ctrl in this.Controls)
                {
                    if (ctrl is TextBox)
                    {
                        ctrl.MouseClick += new System.Windows.Forms.MouseEventHandler(this.AllTextBoxes_MouseClick);
                    }
                }
    

    您可以像这样在 GroupBox 中重置 TextBox 文本

    foreach (Control ctrl in groupBox1.Controls)
                {
                    if (ctrl is TextBox)
                    {
                        MessageBox.Show(ctrl.Name);
                    }
                }
    

    对于所有 GroupBox,您可以:

    foreach (Control control in this.Controls)
    
        {
            if(control is GroupBox)
            {
            foreach (Control ctrl in groupBox1.Controls)
                        {
                            if (ctrl is TextBox)
                            {
                                MessageBox.Show(ctrl.Name);
                            }
                        }
            }
        {
    

    【讨论】:

    • 好,但我认为此代码不适用于 groupbox 中的任何文本框。并且 groupbox 中至少有 60 个文本框 :(
    • @Mehrdad 你为什么这么认为?
    • 哇非常好的工作:) 你能帮我如何为所有 gropbox 设置它吗?谢谢
    【解决方案3】:

    neurotix 正朝着正确的方向前进,但这不会在子容器中捕获您的文本框,也不会处理调用正确的函数来设置正确的文本框的属性。在没有用户控件的情况下处理它的最佳方法是使用递归函数来分配您的事件处理程序。

    public void SetTextBoxClickHandler(Control control)
    {
        foreach (Control childControl in control.Controls)
        {
            if (childControl is TextBox)
            {
                childControl.Click += this.MyClickHandler;
                continue;
            }
            if (item.Controls == null)
                continue;
            SetTextBoxClickHandler(childControl);
        }
    }
    
    private void MyClickHandler(object sender, MouseEventArgs e)
    {
        typeof(Form).InvokeMember(string.Format("{0}s", ((Control)sender).Name), BindingFlags.InvokeMethod | BindingFlags.NonPublic, null, null, new object[] { Clipboard.GetText() });
    }
    
    private void Form1_Load(object sender, EventArgs e)
    {
        SetTextBoxClickHandler(this.Controls);
    }
    

    如果您使用用户控件,那真的很简单,只需从 TextBox 继承,并将所有内容设置为使用新控件即可。

    public class ClickableTextBox : TextBox
    {
        public ClickableTextBox()
        {
            this.Click += MyClickHandler;
        }
        void setText(string input)
        {
            this.ForeColor = Color.Black;
            this.Text = input;
        }
    
        private void MyClickHandler(object sender, MouseEventArgs e)
        {
            setText(Clipboard.GetText());
        }
    }
    

    出于以下原因,我建议创建客户用户控件:

    1. 避免使用反射根据名称动态调用方法对性能造成的影响
    2. 避免在每次点击时将对象发送者转换为控件对性能的影响
    3. 避免在检查每个控件和窗体上的子控件的初始化循环期间对性能造成影响,无论它是否为 TextBox
    4. 需要维护的代码更少
    5. 更高的可重用性,表单代码,必须出现在每个表单上,如果您需要在不同的项目或不同的表单上重用它,重用自定义用户控件比复制要容易得多/将代码粘贴到可能需要更改的每个表单中

    当然,如果您需要做的只是设置文本,而该函数中没有其他内容,您可以稍微简化一下...

    public void SetTextBoxClickHandler(Control control)
    {
        foreach (Control childControl in control.Controls)
        {
            if (childControl is TextBox)
            {
                childControl.Click += this.MyClickHandler;
                continue;
            }
            if (item.Controls == null)
                continue;
            SetTextBoxClickHandler(childControl);
        }
    }
    
    private void MyClickHandler(object sender, MouseEventArgs e)
    {
        TextBox textBox = sender as Textbox;
        if (textBox == null)
            return;
        textBox.ForeColor = Color.Black;
        textBox.Text = Clipboard.GetText();
    }
    
    private void Form1_Load(object sender, EventArgs e)
    {
        SetTextBoxClickHandler(this.Controls);
    }
    

    或使用用户控件:

    public class ClickableTextBox : TextBox
    {
        public ClickableTextBox()
        {
            this.Click += MyClickHandler;
        }
    
        private void MyClickHandler(object sender, MouseEventArgs e)
        {
            this.ForeColor = Color.Black;
            this.Text = input;
        }
    }
    

    由于上述许多原因,我仍然推荐自定义用户控件。

    【讨论】:

      【解决方案4】:

      据我所知,您希望复选框用作切换 - 选中时,删除文本框的内容,未选中时,将剪贴板复制到其中。

      代码如下:

      void textBox_MouseClick(object sender, MouseEventArgs e)
      {
          textBox tb = (TextBox)sender;
          if (checkBox1.IsChecked)
          {
              tb.Text = "";
          }
          else
          {
              tb.Text = Clipboard.GetText();
          }
      }
      

      然后您可以让文本框上的所有 Click() 事件都指向这一方法 - 代码重用万岁:D

      【讨论】:

      • 所有 85 个文本框都使用此代码? 85 文本框.!我需要所有文本框的 1 个代码,此代码对我没用:-?
      • 不,你可以设置所有的文本框使用这一段代码。转到您正在处理的表单 > 单击文本框,查看左侧的属性窗口,转到事件选项卡,找到 MouseClick() 事件并将字段中的文本替换为 textBox_MouseClick。是的,您必须对所有 85 个文本框执行此操作,但您只需执行一次。要么就是这样,要么将上面的代码粘贴到所有当前的事件处理程序中(我假设也有 85 个)。
      • 没有。如果单击任何文本框剪贴板仅复制到 tb.Text :)
      • 看看 'tb' 是从哪里来的——这是一个标准的 EventHandler 方法。 'sender' 是引发事件的对象 - 所以如果 textBox1 调用它,它将是对 textBox1 的引用,如果 textBox2 调用它,它将是对 textBox2 等的引用。所以我们可以简单地获取 sender 并将其转换为一个文本框(我将其命名为“tb”),以便从中获取文本。
      猜你喜欢
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 2015-06-15
      相关资源
      最近更新 更多