仅在包含组合框的用户控件中显示唯一值

时间:2015-04-28 09:27:19

标签: c# winforms combobox

我有一个包含组合框的用户控件。所有组合框都直接绑定到相同的数据表,用户控件创建大约10次。我的问题是,用户可以从其他组合框中的组合框中选择相同的值。例如,他们会选择“测试”。在第一个组合中,在第二个组合中,我需要测试'不是一个可用的选择。因此,每个组合框只能包含一个可用选项。

我知道我需要将逻辑应用于Combo的ValueChanged事件,但不确定如何根据所选内容限制选项。

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

从数据表中删除所选行,并将其绑定到第一个组合框ChangedEvent上的第二个组合框。

我们说你的数据表是dtTable,然后是

LocalTime start = LocalTime.parse("19:00");
LocalTime end = LocalTime.parse("17:10");
Duration elapsed = Duration.between(start, end);
System.out.println(elapsed.toMinutes());

现在将dtTable绑定到comboBox 2

答案 1 :(得分:0)

如果您在问题中共享了一些代码,那会有所帮助。然而,这里有一些快速和肮脏的东西可能有所帮助。当然,这可以更好地实现跨越式发展,但正如我所说,这是快速和肮脏的。

在控件中:

public partial class ComboBoxControl : UserControl, INotifyPropertyChanged
{
    public ComboBoxControl()
    {
        InitializeComponent();
    }

    public string LabelText
    {
        get;
        set;
    }

    private string _dataBindingFilter;

    public string DataBindingFilter
    {
        get
        {
            return _dataBindingFilter;
        }
        set
        {
            if (value != _dataBindingFilter)
            {
                _dataBindingFilter = value;
                NotifyPropertyChanged("DataBindingFilter");

            }
        }
    }

    public DataTable DataSource
    {
        get;
        set;
    }

    public string DisplayMember
    {
        get;
        set;
    }

    public string ValueMember
    {
        get;
        set;
    }

    public ComboBoxControl ChildControl
    {
        get;
        set;
    }

    public void BindComboBox()
    {
        comboBox1.SelectedIndexChanged -= new EventHandler(comboBox1_SelectedIndexChanged);

        if (string.IsNullOrEmpty(DataBindingFilter))
        {
            comboBox1.DataSource = DataSource;
        }
        else
        {
            DataView view = DataSource.AsDataView();
            view.RowFilter = DataBindingFilter;
            comboBox1.DataSource = view;
        }

        comboBox1.DisplayMember = DisplayMember;
        comboBox1.ValueMember = ValueMember;
        comboBox1.SelectedIndex = -1;

        comboBox1.SelectedIndexChanged += new EventHandler(comboBox1_SelectedIndexChanged);
    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (ChildControl != null)
        {
            ChildControl.DataSource = DataSource;
            ChildControl.ValueMember = ValueMember;
            ChildControl.DisplayMember = DisplayMember;
            ChildControl.DataBindingFilter = ChildControl.ValueMember + "<>" + comboBox1.SelectedValue;
        }

    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(string propertyName)
    {
        BindComboBox();

        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

}

在表单中,假设您有2个控件,则:

comboBoxControl1.DataSource = table;
comboBoxControl1.ValueMember = "Id";
comboBoxControl1.DisplayMember = "Value";
comboBoxControl1.BindComboBox();
comboBoxControl1.ChildControl = comboBoxControl2;

假设您有一个包含数据的表对象。