更改组合框的DisplayMember和ValueMember属性

时间:2019-01-11 09:54:51

标签: c# winforms combobox

是否可以丢弃ValueMemberDisplayMember属性,并使组合框改为使用其他属性?

我要说的是:添加属性,以便它们在属性网格中不可见。

[Browsable(false)]
public new ValueMember {get; set;}

[Browsable(false)]
public new DisplayMember {get; set;}

然后,声明两个新属性,并用所需的值填充它们...

 public new MyValueMember {get; set;}   
 public new MyDisplayMember {get; set;}

...并使组合框使用声明的属性进行绑定。

这可能吗?任何帮助都非常感谢。

编辑: 我正在使用实体框架,并且在设计时为绑定源设置数据源并设置MemberValue

它在尝试重新打开表单时给您一个错误,告诉您在绑定域的数据源上找不到属性名称的类型。

为了防止出现这种情况,我想到了添加属性MyValuemember和MyDisplayMember 和MyDatamember属性,因此在设置组合框数据源之后,我将从Mydatamember属性中选择Datamember,而不是相对地从列表中选择MyDisplayMember和MyValuemember,并将MyDisplay&Valuemember设置为base.DisplayMember&base.Valuemember,但是我不能这样做,因为数据源是父级,并且这些属性不可用。

所以我提出了一个可行的不同解决方案:

如果其他人跌跌撞撞地遇到了同样的问题,以下是我的解决方案:

我添加了一个新的数据源属性名称Base4Datasource 并且我添加了一个名为Base4Datamember的新DataMember属性

因此,在我设置Base4Datasource之后,我克隆了值并进行了设置,这比我填充Base4Datamember并进行设置时,我再次使用valuemember设置了数据源。

[Browsable(false)]
    public new object DataSource
    {
        get => base.DataSource;
        set => base.DataSource = value;
    }


    public object _base4DataSource = new BindingSource();

    [AttributeProvider(typeof(IListSource))]
    [DefaultValue(null)]
    [RefreshProperties(RefreshProperties.Repaint)]
    [Category("Base4Data")]
    [DisplayName("Base4 DataSource")]
    public object Base4DataSource
    {
        get => _base4DataSource;
        set
        {

            if (value != null)
            {
                var cloned = value.CustomMemberwiseClone();
                DataSource = cloned;
                _base4DataSource = cloned;
            }
            else
            {
                _base4DataSource = null;
                DataSource = null;

                Base4DataMember = string.Empty;
                BindingField = string.Empty;
            }


        }
    }

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public string _base4DataMember;

    [Category("Base4Data")]
    [DisplayName("Base4 Data Member")]
    [Description("Please Select a Datamember from the list")]
    [TypeConverter(typeof(ComboboxDataMemberConverter))]
    public virtual string Base4DataMember {
        get => _base4DataMember;
        set
        {
            _base4DataMember = value;

            if (value != null)
            {
                base.DataSource = new BindingSource(DataSource, value);
            }
            {
                ValueMember = string.Empty;
                DisplayMember = string.Empty;
                FillMethod = string.Empty;
            }


        }
    }

0 个答案:

没有答案