none
请问如何自定义控件string属性的数据有效性?类似color那样的属性! RRS feed

  • 问题

  • 我想做一个自定义控件,里面有个string属性比方说名字叫省份,我提前做好了省份的列表(存储在数据库或者excel文件)。在设计定义这个属性的时候,我想只允许从一个列表里选择,这样用户不用手打,可以直接combox下拉列表选择,也可以保证不会输入其他的不在列表里面的值。

    目前发现如果用enum或者struck可以实现,但是那个需要提前都写好,并设置未static,但是我这个列表需要存在数据库或者外部的excel表。只能临时读入,请问这种情况如何实现?


    2019年9月20日 2:44

全部回复

  • Hi,

    你是想在Form窗体中设置自定义控件中某个控件(如ComboBox)的属性吗?如果是,你可以通过定义属性来实现他。

    首先,在UserControl.cs中定义属性Combox,

        public ComboBox Combox
        {
            get { return comboBox1; }
            set { value = comboBox1; }
        }

    之后,你就可以通过该属性在Form中修改ComboBox的DataSource,

        private void Form1_Load(object sender, EventArgs e)
        {
            List<int> list = new List<int> { 1, 2, 3, 4, 5 };
            userControl11.Combox.DataSource = list;
        }

    如果理解有误,请详细指出说明。

    Regards,

    Kyle


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年9月20日 5:15
    版主
  • 谢谢回答。

    理解大部分是对的,后面有些不一样。

    这个自定义控件,我需要用在不同的form里,并且在设计阶段能点开,然后从里面选择一个,请注意是设计阶段。选择的数据源我希望存储在txt或者excel等

    2019年9月25日 3:11
  • Hi,

    或许你可以尝试动态创建枚举,请参考以下代码。

        public static void CreateEnum(string enumname)
        {
            AppDomain currentDomain = AppDomain.CurrentDomain;
            AssemblyName aName = new AssemblyName("TempAssembly");
            AssemblyBuilder ab = currentDomain.DefineDynamicAssembly(
            aName, AssemblyBuilderAccess.RunAndSave);
            ModuleBuilder mb = ab.DefineDynamicModule(aName.Name, aName.Name + ".dll");
            EnumBuilder eb = mb.DefineEnum(enumname, TypeAttributes.Public, typeof(int));
            int count = 0;
            foreach (var i in provinceList)
            {
                eb.DefineLiteral(i, count);
                count++;
            }
            finished = eb.CreateType();
            ab.Save(aName.Name + ".dll");
            foreach (object o in Enum.GetValues(finished))
            {
                Console.WriteLine("{0}.{1} = {2}", finished, o, ((int)o));
            }
        }

    Regards,

    Kyle


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年9月25日 6:20
    版主