【问题标题】:How can several user controls respond to an event that occurs in one of them in c#?c# 中多个用户控件如何响应其中一个用户控件中发生的事件?
【发布时间】:2013-01-28 04:39:29
【问题描述】:

我有一个由复选框组成的用户控件。我在一个表单上有 4 个这样的用户控件。当用户单击用户控件中的任何一个复选框时,我希望其他用户控件确保它们未被选中。类似于单选按钮的工作方式,除了我需要使用复选框和事件。

【问题讨论】:

  • 为什么需要使用复选框而不是单选按钮?
  • @zespri - 一旦选中(意外)单选按钮,您将无法取消选中它。用户可能不想选择任何选项。
  • 这通常通过添加第 5 个单选按钮“以上都不是”来解决
  • 复选框仅代表其他内容。我正在研究一些用户控件,它们的作用类似于绘画程序中的绘画工具。我想显示一个用户选择了其中一个工具的视觉指示,并且我想让应用同时取消选择任何其他选择的工具。

标签: c# winforms events checkbox user-controls


【解决方案1】:

一种简单的方法是对CheckBoxes 的所有事件使用单一方法,并以这种方式利用sender 对象:

List<CheckBox> listCheckBoxes;

checkBox1.CheckedChanged += new EventHandler(checkBox_CheckedChanged);
checkBox2.CheckedChanged += new EventHandler(checkBox_CheckedChanged);
checkBox3.CheckedChanged += new EventHandler(checkBox_CheckedChanged);
checkBox4.CheckedChanged += new EventHandler(checkBox_CheckedChanged);

listCheckBoxes = this.Controls.OfType<CheckBox>().ToList();

void checkBox_CheckedChanged(object sender, EventArgs e){
    CheckBox checkBox = (CheckBox)sender;
    if(checkBox.Checked){
        foreach(CheckBox c in listCheckBoxes){
            if(c.Checked && c != checkBox)
               c.Checked = false;
        }
    }
}

【讨论】:

    【解决方案2】:

    事件处理程序通常是表单(或自定义容器)的方法。您通常了解该级别的其他控件。如果您尝试在自定义控件本身上执行该事件处理程序,您将会遇到问题,因为您会将控件绑定到其他控件。

    拥有某种具有事件处理程序来执行此逻辑的容器控件会是一个更好的设计。然后将该事件处理程序添加到每个复选框的Click 事件中。

    【讨论】:

      【解决方案3】:

      将控件封装在一个 UserControl 中。当一个事件在单个 CheckBox 控件上触发时,会为其余的 CheckBox 控件引发一个通用切换事件。

      【讨论】:

        【解决方案4】:

        好的,如果我假设正确的话。您在一个表单中有 4 个用户控件,它们需要在某些事件上相互通信(在您的情况下,这是由您的一个用户控件中的复选框引起的事件)

        我会实现订阅者/发布者模型。
        在 Usercontrol-A(发布者)中 1)在复选框上单击引发事件,将其转发给公共事件函数

        包含用户控件的页面类,将订阅用户控件A的事件,如果需要,将其转发给用户控件B(订阅者)

        更多详情请看这里 http://www.codeproject.com/Articles/15550/How-to-invoke-events-across-User-Controls-in-ASP-N

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-04-23
          • 1970-01-01
          • 2012-04-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多