将泛型集合 List<> 绑定到属性网格

2023-12-14

我尝试绑定通用集合列表联系方式 to propGrid但输出与我的预期不符。我想列表联系方式显示为ListBox in propGrid。我该怎么做?谢谢。

class Contact
{
    public string Name { get; set; }
    public string Address { get; set; }
}

PropertyGrid propGrid = new PropertyGrid();
List<Contact> listContact   = new List<Contact>();

private void Form1_Load(object sender, EventArgs e)
{
    listContact.Clear();
    Contact newContact = null;

    newContact = new Contact();
    newContact.Name = "diana";
    newContact.Address = "en";
    listContact.Add(newContact);

    newContact = null;
    newContact = new Contact();
    newContact.Name = "maxim";
    newContact.Address = "cand";
    listContact.Add(newContact);

    propGrid.SelectedObject = listContact;
    this.Controls.Add(propGrid);
    propGrid.Dock = DockStyle.Fill;

}

你必须扩展你的类才能使用ExpandableObjectConverter。这使得可解析发生。

请参阅下面的代码。只是一个失败的例子。选择您最喜欢的一个。 用于编码的来源:MSDN

[TypeConverter(typeof(Contact))]
[DescriptionAttribute("Expand to see the spelling options for the application.")]
class Contact : ExpandableObjectConverter
{
    [DefaultValueAttribute("Contact Name")]
    public string Name { get; set; }
    public string Address { get; set; }

    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
        if (destinationType == typeof(Contact))
        {
            return true;
        }
        return base.CanConvertTo(context, destinationType);
    }

    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(System.String) && value is Contact)
        {
            Contact contact = value as Contact;

            return string.Format("Name: {0} - Address: {1}", contact.Name, contact.Address);
        }
        return base.ConvertTo(context, culture, value, destinationType);
    }
}

[TypeConverter(typeof(Contact2))]
[DescriptionAttribute("Expand to see the spelling options for the application.")]
class Contact2 : ExpandableObjectConverter
{
    private Contact contato1;
    public Contact Contato1
    {
        get
        {
            return contato1;
        }
        set
        {
            contato1 = value;
        }
    }

    private Contact contato3;
    public Contact Contato3
    {
        get
        {
            return contato3;
        }
        set
        {
            contato3 = value;
        }
    }

    public Contact2()
    {
        this.contato1 = new Contact()
        {
            Address = "Add1",
            Name = "Name1"
        };
        this.contato3 = new Contact()
        {
            Address = "Add3",
            Name = "Name3"
        };
    }
}

public partial class Form2 : Form
{
    PropertiesList<Contact> listContact = new PropertiesList<Contact>();
    //List<Contact> listContact = new List<Contact>();

    public Form2()
    {
        InitializeComponent();
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        listContact.Clear();
        Contact newContact = null;

        newContact = new Contact();
        newContact.Name = "diana";
        newContact.Address = "en";
        listContact.Add(newContact);

        newContact = null;
        newContact = new Contact();
        newContact.Name = "maxim";
        newContact.Address = "cand";
        listContact.Add(newContact);

        propGrid.AllowDrop = true;

        object[] itens = new object[2];
        itens[0] = listContact;
        itens[1] = newContact;
        propGrid.SelectedObject = listContact;
        this.Controls.Add(propGrid);
        propGrid.Dock = DockStyle.Fill;
    }
}

[TypeConverter(typeof(Contact))]
class PropertiesList<T> : ExpandableObjectConverter where T : Contact
{
    private List<T> innerList = new List<T>();

    public List<string> Names
    {
        get
        {
            List<string> valuesReturned = null;
            if (innerList.Count > 0)
            {
                valuesReturned = new List<string>();
                for (int i = 0; i < innerList.Count; i++)
                {
                    valuesReturned.Add(innerList[i].Name);
                }

            }
            return valuesReturned;
        }
    }

    public List<T> Item
    {
        get
        {
            List<T> valuesReturned = null;
            if (innerList.Count > 0)
            {
                valuesReturned = new List<T>();
                for (int i = 0; i < innerList.Count; i++)
                {
                    valuesReturned.Add(innerList[i]);
                }

            }
            return valuesReturned;
        }
    }

    public Color GetColors { get; set; }

    public Contact2 Contato22
    {
        get
        {
            return new Contact2();
        }
    }

    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
        if (destinationType == typeof(Contact))
        {
            return true;
        }
        return base.CanConvertTo(context, destinationType);
    }

    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(System.String) && value is Contact)
        {
            Contact contact = value as Contact;

            return string.Format("Name: {0} - Address: {1}", contact.Name, contact.Address);
        }
        return base.ConvertTo(context, culture, value, destinationType);
    }

    #region Simulate List
    public void Add(T item)
    {
        innerList.Add(item);
    }

    public void Clear()
    {
        innerList.Clear();
    }
    #endregion
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将泛型集合 List<> 绑定到属性网格 的相关文章

随机推荐

  • C++ 的 C 包装器:如何处理 C++ 模板?

    早些时候询问如何为 C 类编写一个 C 包装器 C 的 C 包装 基本就清楚了 但还有一个问题 如何处理 C 模板 假设这是我的课 template
  • 使用要显示最后一个活动的活动组在选项卡之间切换 - Tab ActivityGroup

    我已经为我的 Android 应用程序编写了选项卡 我的问题是使用它想要显示最后一个活动的活动组在选项卡之间切换 我想在导航选项卡时显示上次打开 访问的屏幕 我的方法是转到第一个屏幕 我需要在浏览选项卡时显示上次打开的屏幕 选项卡 1 gt
  • 立即更新 CALayer 子层

    我有 UIView 其结构如下 UIView layer CALayer depthLayer CALayer bodyLayer CALayer For layer我设置 needDisplayOnBoundsChange true 当我
  • react-native启动报:Error: UNKNOWN: 未知错误,打开...\.babel.json

    我在Windows 7上有一个RN开发环境 它运行得很好 直到昨天我运行 react native start后突然报错 错误消息 2016 12 26 09 58 17 HMR Server listening on hot React
  • 在java中将文件重命名为另一个文件

    我有一个文件需要重命名为现有文件的名称 这是对现有 JAR 文件的复制 修改 替换原始操作 我已经完成了前两个步骤 我只需要更换原始位的帮助 将新版本的 JAR 重命名为旧版本的最佳方法是什么 旧 JAR 不需要保留 而且我不想保留新 JA
  • 在 Either 中指定 Case 对象的类型

    如果我有一个对象如下 case object Foo 我尝试创造这样的价值 Either Foo B 我收到编译错误 指出找不到 Foo 但如果我这样做 Either Foo type B 它编译 我的问题是这样做是否正确 每当你想声明一个
  • 如何根据执行程序/子安装程序的过程结果重新启动 Inno Setup 安装程序

    我有一个安装过程 如果未安装子 exe 则执行该安装过程 如果是这样 我想要最终的 启动我的应用程序 末尾的复选框将替换为 重新启动计算机 复选框 我怎样才能做到这一点 我尝试使用NeedRestart 并使用全局布尔变量 但我似乎无法让它
  • 如何创建没有 setter 函数的 getter 函数?

    我的脚本中有多个导出的变量 每当更改一个变量时 我想调用一个通用的 getter 并让值自动设置 tool export float var sample1 setget smthn changed export float var sam
  • 为什么 padding: 0 隐藏我的无序列表项目符号?

    我正在更新一个旧网站 其中有很多无序列表 每当 padding 设置为 0 时 无序列表的显示 标记 就会消失 问题是 CSS 设置 padding 0 margin 0 我现在正在删除它 每个克里斯 科伊尔的笔记 是 不再酷 为什么pad
  • 放大/缩小鼠标点?

    As seen in the pictures 我在 QScrollArea 中有 QWidget QWidget 充 当细胞图像和一些基于矢量的轮廓数据的渲染小部件 用户可以执行放大 缩小操作 简单地发生的是 它改变了 QPainters
  • “{Binding Path=.}”和“{Binding}”真的相等吗

    在我的 WPF 项目中 我有一个列表框 用于显示来自List
  • 无法移出 Rust 中借用的内容

    pub struct Character name String hp i32 level i32 xp i32 xp needed i32 gold i32 impl Character pub fn new name String gt
  • 使用 Azure Powershell 或 Azure CLI 创建 Log Analytics 警报

    我正在尝试在 azure 门户的 LogAnlytics 中创建警报 需要为 5 个数据库创建 6 个警报 因此必须手动创建 30 个警报 并且非常耗时 因此需要一种自动化方法 尝试通过创建使用 Azure PowerShell 创建警报
  • 在批处理作业中创建文件名作为时间戳

    我们有一个每天运行的批处理作业 并将文件复制到拾取文件夹 我还想获取该文件的副本并将其放入具有文件名的存档文件夹中 yyyy MM dd log 在 Windows 批处理作业中执行此操作的最简单方法是什么 我基本上是在寻找与此 Unix
  • 检测 HTML5 Video 元素是否正在播放 [重复]

    这个问题在这里已经有答案了 我浏览了几个问题来了解 HTML5 元素是否正在播放 但找不到答案 我查看了 W3 文档 它有一个名为 playing 的事件 但我似乎无法让它工作 这是我当前的代码 var stream document ge
  • Mockito 通过,但代码覆盖率仍然较低

    package com fitaxis test import java sql SQLException import org junit Assert import org junit Test import org mockito M
  • 在 Vue 项目中创建和操作 SVG

    我是 Vue js 新手 需要创建一个 Vue 组件来创建和操作 SVG 根据我的理解 在 Vue 组件中使用 JQuery 并不是最好的选择 不过我愿意 因为选择元素非常简单 这是我的 Vue 组件 但我不确定如何使其发挥作用 注意 SV
  • 如何通过jquery将点击更改为鼠标悬停或悬停?

    我想在鼠标悬停或悬停时显示日期 现在是 onclick 我已经使用工具提示来显示数据 但我想在鼠标悬停时显示数据 我尝试了很多但没有成功 任何机构都可以提供帮助 我们将不胜感激 提前致谢 这是我的代码 它想在单击鼠标悬停 悬停时进行更改
  • 按修改日期排序该数组?

    我有一个 php 文件 它在我的用户目录中创建一个包含所有内容的数组 然后该数组被发送回 iPhone 我的 php 创建的数组按字母顺序排序 我希望它按文件创建日期排序 这是我的 php 文件的样子 我该怎么做 谢谢 Using usor
  • 将泛型集合 List<> 绑定到属性网格

    我尝试绑定通用集合列表联系方式 to propGrid但输出与我的预期不符 我想列表联系方式显示为ListBox in propGrid 我该怎么做 谢谢 class Contact public string Name get set p