自定义 Combobox 控件自定义数据源,带有自定义 displaymember 和 valuemember

     2023-05-07     122

关键词:

【中文标题】自定义 Combobox 控件自定义数据源,带有自定义 displaymember 和 valuemember【英文标题】:Custom Combobox control custom datasource with custom displaymember and valuemember 【发布时间】:2011-01-18 10:51:48 【问题描述】:

我正在开发一个继承自另一个组合框 (Janus UICombobox) 的自定义组合框控件。 我希望数据源基于 EntityType (LLBLGEN),这样当用户选择 EntityType 时,该 EntityType 的所有数据库记录都将加载到组合框中。

在我构建和运行时一切正常,但我也希望能够让用户有机会根据所选的 EntityType 选择 DisplayMember 和 ValueMember。

我有以下代码:

    public partial class DtUiComboBox : UIComboBox

    private Thread _loadThread;

    public DtUiComboBox()
    
        InitializeComponent();
    

    //Don't want this to be visible in the designer
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    public new object DataSource
    
        get;
        set;
    
    //Don't want this to be visible in the designer
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    public new string DisplayMember
    
        get;
        set;
    
    //Don't want this to be visible in the designer
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    public new string ValueMember
    
        get;
        set;
    
    //Don't want this to be visible in the designer
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    public new string DataMember
    
        get;
        set;
    

    //My Custom DisplayMember that should be based on the EntityFields from the selected EntityType
    [Category("Data")]
    public string DisplayField
    
        get;
        set;
    
    //My Custom ValueMember that should be based on the EntityFields from the selected EntityType
    [Category("Data")]
    public string ValueField
    
        get;
        set;
    

    private EntityType? _entityType;
    [Category("Data")]
    public EntityType? EntityTypeSource
    
        get
        
            return _entityType;
        
        set
        
            if (value != null)
            
                _entityType = value;
                IEntity2 entity2 = Dal.FactoryClasses.GeneralEntityFactory.Create(_entityType.Value);
                if (!DesignMode && !IsDesignerHost)
                
                    if (_loadThread != null && _loadThread.IsAlive)
                    
                        _loadThread.Abort();
                        _loadThread.Join(500);
                    
                    _loadThread = new Thread(new ThreadStart(LoadFromEntityType));
                    _loadThread.Start();
                
                Invalidate(true);
            
        
    

    private void LoadFromEntityType()
    
        if (_entityType.HasValue)
        
            IEntityCollection2 entityCollection = DtBlClient.Instance.Bl.GetCollection(_entityType.Value);
            LoadFromEntityType(entityCollection);
        
    

    private delegate void LoadFromEntityTypeDel(IEntityCollection2 collection2);
    private void LoadFromEntityType(object data)
    
        if (this.InvokeRequired)
        
            this.BeginInvoke(new LoadFromEntityTypeDel(LoadFromEntityType), data);
            return;
        
        DataSource = data;
    

    [BrowsableAttribute(false)]
    [Description("This method checks if I run in DesignMode, because Threading doesn't work in the Designer")]
    public bool IsDesignerHost
    
        get
        
            Control ctrl = this;

            while (ctrl != null)
            
                if ((ctrl.Site != null) && ctrl.Site.DesignMode)
                    return true;
                ctrl = ctrl.Parent;
            
            return false;
        
    

    [Browsable(false)]
    [Description("This method checks if I run in DesignMode, because Threading doesn't work in the Designer")]
    public new static bool DesignMode
    
        get
        
            string processName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
            if (processName.Equals("devenv"))
                return true;
            return false;
        
    

我该怎么做?

【问题讨论】:

【参考方案1】:

如果您有两个用户可以在设计器(或代码)中设置的属性(即显示成员和值成员),您应该能够调用您的基类 (UIComboBox) 并将这些值设置为它们在基类中的等价物。

编辑(评论后):

This link 为您提供了两种获取给定实体的实体字段的方法(一种处理实体数据模型,第二种处理反射)。它解决了你一半的问题。但我不知道如何将此字段列表绑定到设计器...

【讨论】:

我理解那部分,但也许我的问题不够清楚,所以我会尝试解释:当用户选择 EntityType 时,我希望能够传递该实体的所有 EntityFields作为 DisplayMember 和 ValueMember 中的可选列表。【参考方案2】:

Net Framework 支持以多种方式自定义设计时行为。将属性和值提供给属性窗口的一种方法是通过 TypeConverter 对象。您可以通过实现自定义 TypeConverter 来实现这一点,但它还需要您装饰他们可能选择的所有类并为每个类提供类型转换器。

您可以通过创建自定义设计器对自定义控件的设计时行为的几乎任何方面进行广泛控制。自定义设计器将允许您跳过修改数据实体以供 UI 控件使用的半破解。相反,您可以构建自己的代码来探索实体(例如通过反射),然后根据您的选择填充属性窗口。创建自定义设计器并非易事,并且没有很好的文档记录。假设您不从事为零售市场制作控件的业务,这需要做很多工作,但如果您想要一个不受黑客攻击且可与任何数据实体一起使用的“专业”控件,那么定制设计器是您的最佳选择。

当然这将是一个不错的功能,但老实说,有多少属性甚至是这些参数的合适候选者。我几乎总是将“Id”作为值成员,而显示成员通常是“名称”顺序的东西。为数据绑定选择(并记住)字段往往是微不足道的,而您想要做的事情可能会被证明是乏味且耗时的。但是如果你想尝试......

没有人会一步一步地向您展示如何执行此操作,并且很难找到相关示例。当你冒险进入定制设计师时,你几乎是靠自己的。以下是一份技术概述文件,可帮助您开始研究这些技术:

http://msdn.microsoft.com/en-us/magazine/cc164048.aspx#S5

【讨论】:

WPF 自定义控件,将多个 ComboBox 值组合成单个 DependencyProperty

】WPF自定义控件,将多个ComboBox值组合成单个DependencyProperty【英文标题】:WPFCustomControl,CombinemultipleComboBoxvaluesintosingleDependencyProperty【发布时间】:2021-12-2914:05:16【问题描述】:我有一个自定义控件,其中包含两个ComboBoxes,其中... 查看详情

带有自定义控件和自定义 StringProperty 的 Proguard

】带有自定义控件和自定义StringProperty的Proguard【英文标题】:ProguardwithcustomcontrolandcustomStringProperty【发布时间】:2021-12-2706:56:59【问题描述】:我想将proguard与带有一些自定义控件的javafx应用程序一起使用。我有一个包含属性的... 查看详情

带有自定义控件的 MPMoviePlayerController

】带有自定义控件的MPMoviePlayerController【英文标题】:MPMoviePlayerControllerwithcustomcontrols【发布时间】:2010-07-2308:19:30【问题描述】:我向MPMoviePlayerController添加了一些自定义控件。这在文档中明确写了这是可能的:您可以在此属性... 查看详情

wpf自定义控件combobox依赖属性

我新建了一个usercontrol,里面套了一个ComboBox代码如下<UserControl><ComboBoxItemsSource="BindingSource=x:Staticlocal:CustomCombobox.SubjectList"SelectedItem="BindingPath=SelectedSubject,RelativeSource=RelativeSourceMode=FindAncestor,AncestorType=x:TypeUserCont... 查看详情

winform自定义自动完成控件(代码片段)

...有自动完成控件,同样的,winform也有,在我们的TextBox和ComboBox中,只需要设置AutoCompleteSource属性为CustomSource,然后将值加入到AutoCompleteCustomSource中就可以了  比如:  string[]dataSource=newstring[]"apple","o 查看详情

wpf自定义combobox下拉颜色控件(代码片段)

WPF自定义ComboBox下拉颜色控件1.创建类publicclassDataItempublicDataItem()publicstringColorNameget;set;publicDataItem(stringitemName)this.ColorName=itemName;2.添加前端<ComboBoxName="txtColor"MinWidth="200"Height="30"SelectedValuePath="... 查看详情

带有子控件的 Win32 自定义控件

】带有子控件的Win32自定义控件【英文标题】:Win32customcontrolwithchildcontrols【发布时间】:2012-07-2713:32:35【问题描述】:我创建了一个包含子控件的自定义容器控件(所有者绘制等)。不幸的是,这些子控件永远不会更新(它们... 查看详情

带有自定义控件的 UITableViewCell

】带有自定义控件的UITableViewCell【英文标题】:UITableViewCellwithcustomcontrol【发布时间】:2016-05-1700:24:34【问题描述】:我正在尝试创建派生的UITableViewCell。右侧(青色,200宽,但将在未来运行时调整大小)包含我的评级控件。左... 查看详情

带有泛型的 WPF 自定义控件 - 可能吗?

】带有泛型的WPF自定义控件-可能吗?【英文标题】:WPFcustomcontrolwithgenerics-possible?【发布时间】:2011-10-2500:55:07【问题描述】:我想使用泛型创建一个自定义WPF控件:publicclassMyGenericTypeControl<T>:ItemsControl//...这可能吗?在我... 查看详情

带有 StackPane 和自定义控件的 Javafx TabPane

】带有StackPane和自定义控件的JavafxTabPane【英文标题】:JavafxTabPanewithStackPaneandcustomControls【发布时间】:2014-12-2921:42:51【问题描述】:我正在用JAVAFX开发一个应用程序。主要是,该应用程序使用TabPane控制器。在第一个选项卡中,... 查看详情

带有自定义 html5 控件的 Airplay

】带有自定义html5控件的Airplay【英文标题】:AirplaywithCustomhtml5controls【发布时间】:2012-11-1906:21:57【问题描述】:有谁知道是否有办法让Airplay处理使用CUSTOMCONTROLS的html5视频?这是重要的部分,我意识到如果您使用内置的html5控... 查看详情

使用带有引导程序的 dataTables 将自定义控件附加到 dom

】使用带有引导程序的dataTables将自定义控件附加到dom【英文标题】:AppendcustomcontroltodomusingdataTableswithbootstrap【发布时间】:2017-10-1822:20:16【问题描述】:我为数据表搜索框添加了一个选择(下拉),用于搜索每列,并尝试将该... 查看详情

html带有自定义控件的微调器输入字段(代码片段)

查看详情

带有自定义数据的自定义 UIActivity

】带有自定义数据的自定义UIActivity【英文标题】:CustomUIActivitywithcustomData【发布时间】:2013-05-2007:07:35【问题描述】:我有一些图像和文本想通过Facebook、twitter分享,它工作正常,虽然我想用我的自定义UIActivity分享另一组数据... 查看详情

带有自定义可绘制xml的涟漪效应?

】带有自定义可绘制xml的涟漪效应?【英文标题】:RippleEffectwithcustomdrawablexml?【发布时间】:2017-10-2117:38:17【问题描述】:我需要为所有控件添加涟漪效果以增加应用程序的活力。由于我的最低api级别为18,所以我无法在可绘制... 查看详情

带有集合的自定义控件:集合编辑器出现但立即再次消失

】带有集合的自定义控件:集合编辑器出现但立即再次消失【英文标题】:customcontrolwithCollection:theCollectionEditorappearsbutimmediatedissappearsagain【发布时间】:2021-04-1023:35:09【问题描述】:我正在尝试创建一个自定义控件(应显示在... 查看详情

具有响应式表单的自定义控件

】具有响应式表单的自定义控件【英文标题】:CustomControlswithReactiveForms【发布时间】:2019-11-1503:24:46【问题描述】:我正在使用Angular7,带有反应形式的AngularMaterial控件。我使用带有mat-form-field的AngularMaterial创建了自定义文本(mat... 查看详情

2016-11-11坚持学习day24wpf自定义控件附加属性自定义事件

UserControl,自定义控件。这里刚刚想到一个问题。什么时候应该用usercontrol定义一个控件。什么时候应该重写控件的template和样式,实现新效果。引用一下人家的话:http://www.cnblogs.com/denghejun/p/3671061.html 我的理解:Usercontrol应... 查看详情