【问题标题】:Databindings for custom control wont work?自定义控件的数据绑定不起作用?
【发布时间】:2015-04-25 12:47:12
【问题描述】:

我无法理解为什么我的数据绑定似乎不适用于我的自定义类。我让(破解)我的类扩展了 Control 类以添加数据绑定功能,但它实际上并没有绑定到我的自定义属性。

我的自定义类的代码是:

    public class RadioButtonSet : System.Windows.Forms.Control
    {

        private Dictionary<System.Windows.Forms.RadioButton, int> buttonList;
        private int selectedValue;

        public RadioButtonSet()
        {
            buttonList = new Dictionary<System.Windows.Forms.RadioButton, int>();
        }

        public void AddButton(System.Windows.Forms.RadioButton button, int buttonValue)
        {
            if (this.buttonList.ContainsKey(button))
                throw new Exception("Button set already contains specified button");
            else if (buttonValue <= 0)
                throw new Exception("Cannot add specified key to button set");
            else if (button == null)
                throw new Exception("Parameter button cannot be null");
            else
            {
                button.CheckedChanged += button_CheckedChanged;
                this.buttonList.Add(button, buttonValue);
            }
        }

        private void setSelectedButton()
        {
            this.buttonList.FirstOrDefault(x => x.Value == this.selectedValue).Key.Checked = true;
        }

        private void button_CheckedChanged(object sender, EventArgs e)
        {
            System.Windows.Forms.RadioButton btn = sender as System.Windows.Forms.RadioButton;
            this.selectedValue = this.buttonList[btn];
        }

        public int SelectedButton
        {
            get
            {
                return selectedValue;
            }
            set
            {
                selectedValue = value;
                setSelectedButton();
            }
        }

    }

我尝试使用以下内容绑定到此类,其中 rbs_admin 是我的自定义类的一个实例:

rbs_admin.DataBindings.Add("SelectedButton", datatable, "admin");

我不知道哪些信息可能会有所帮助。

我从由数据适配器填充的数据表中获取要绑定的信息。这个自定义类不在它自己的文件中,它是我项目中另一个静态类的一部分。

我只是不明白,因为我创建了一个具有相同自定义属性的自定义文本框,它绑定并正常工作。

非常感谢任何帮助。

【问题讨论】:

  • 您的绑定是正确的,但您错过了这样一个事实,即您需要通过某种方式从数据表中设置选定的行,以便用户控件更新其绑定。

标签: c# winforms data-binding binding


【解决方案1】:

我在谈论这样的事情:

someListControl.DataSource = datatable;
someListControl.DisplayMember = "someAnotherColumnName"

rbs_admin.DataBindings.Add("SelectedButton", datatable, "admin");

然后,从列表控件中选择一个项目将使您的控件根据所选项目更新其绑定。

【讨论】:

  • 我明白你的意思,但我不明白你的例子。什么是 someListControl?什么是 someAnotherColumnName?它必须是我在数据表中绑定的同一列吗?
  • someListControl 将是表单中的另一个控件,它将充当导航控件。然后 someAnotherColumnName 将是您的数据表中的一列,它允许您从多行中识别和选择一个项目,例如 UserNameColumn。我想你的数据表会有多列(也有多行)。
  • 啊,我明白了。不是这种情况。我道歉。我没有提到这个表单将用于编辑或创建单个记录(行)。在这种情况下,特定用户。我查询数据库,并将表单上的控件绑定到查询中的各种用户相关值。因此,我的数据表中只会有一个或更少(如果创建新用户)记录。我正在尝试实现此类,以便可以将“adminLevel”int 值绑定到与我的集合中的该值关联的指定单选按钮。
  • 在 setSelectedButton 方法的 this.buttonList.FirstOrDefault(...).Key.Checked = true 行中放置一个断点。有可能你在那里遇到了一些不会冒泡的异常。而且我无法从您的代码中看到您将这些单选按钮添加到某个控件集合的位置。这是您的用户控件的完整代码吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 2019-12-26
  • 1970-01-01
  • 2010-10-11
  • 2016-04-23
相关资源
最近更新 更多