【问题标题】:DGV DataSource displays Class name not valueDGV 数据源显示类名而不是值
【发布时间】:2012-12-18 22:09:37
【问题描述】:

我有一个使用 CoolStorage (ORM) CSList 类作为其 DataSource 填充的 DataGridView。它正在显示联系人,并且是 ContactType 列,而不是显示底层的 ContactTypeName,而是为每条记录显示“ContactType”。

我无法通过单步执行数据绑定来更改该单元格的值,尽管当将鼠标悬停在 DataSource 上时,我可以看到它的 ContactTypeName 可用作 ContactType 的属性。

有没有一种方法可以更改 ContactType 单元格中显示的值(我正在考虑类似于 ComboBox 的 DisplayMember 的等效项),而无需从我的结果集中手动构造 DataTable?

非常感谢。

【问题讨论】:

    标签: c# winforms datagridview


    【解决方案1】:

    唯一的我知道的一种无需手动设置列的方法是覆盖ContactType 类的ToString() 函数。

    但是,如果您想编辑它,则需要手动设置列。

    由于某种原因,我所处理的几乎所有其他网格 UI 都需要手动设置列。

    另一种选择是绑定到将 ContactName 作为属性而不是相关对象公开的包装类(基本上是 ViewModel)。您甚至可以使用该模型进行双向绑定。

    【讨论】:

    • 完美,在该类上设置 ToString() 就可以了。非常感谢!
    【解决方案2】:

    您是否考虑过使用CSListGeneric 代替CSList

    然后您可以使用System.Linq 选择要在DataGridView 中显示的内容:

    class Program
    {
        class ContactType
        {
            public string Name { get; set; }
        }
        class Contact
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public ContactType ContactType { get; set; }
        }
        static void Main(string[] args)
        {
            CSList<Contact> contacts = new CSList<Contact>();
            //add contacts to the list
            var x = from c in contacts
                    select new {
                        c.Id,
                        c.Name
                        ContactTypeName=c.ContactType.Name
                    };
        }
    }
    

    【讨论】:

    • 我没有想到这一点,但这是在查询结果上使用 Linq 的好建议。以后肯定会考虑的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多