【问题标题】:Why String.Length is returned instead of actual value in DataSource为什么返回 String.Length 而不是 DataSource 中的实际值
【发布时间】:2011-08-30 16:08:26
【问题描述】:

我有这段代码可以构建IList<string>:

IList<string> databases;

using (MySqlConnection _conn = Session.Connection)
using (MySqlCommand _cmd = _conn.CreateCommand("SHOW databases"))
{
    _cmd.Connection.Open ( );
    var _dr = _cmd.ExecuteReader();

    databases = new List<string> ( _dr.SelectFromReader ( reader =>
        reader[ 0 ] is DBNull ? null : reader[ 0 ].ToString ( ) ) );

    _cmd.Connection.Close ( );
}

dgrid_Main.DataSource = databases;

遵循扩展方法SelectFromReader here的工作原理。

问题是,dgrid_Main 怎么会显示每个数据库的长度...

...而不是名称? 我运行了这个测试:

foreach (string db in databases)
{
    //  winform treeview control
    trv_ServerObjects.Nodes.Add ( db );
}

...我得到以下结果:

【问题讨论】:

  • 那是因为它试图显示投影值的所有公共属性。 strong 的唯一公共属性是 Length
  • @Henk - 确实; iSpelling 的危险
  • 很高兴没有编辑窗口。

标签: c# datagridview datasource ilist


【解决方案1】:

因为 dgrid_Main 上的 DataSource 属性将绑定集合中对象的每个公共属性,而不是它自己的对象。长度是字符串对象的一种公共属性。

当您实际遍历 IList 时,您将获得数据库名称列表。

试试这个..

dgrid_Main.DataSource = databases.ToList().Select(db => new { db });

【讨论】:

  • +1:感谢您的解释(也对@Marc Gravell)完全有道理。感谢您的提示...
【解决方案2】:

我不知道为什么会这样,但尝试使用绑定源?

BindingSource binding1 = new List<string> ( _dr.SelectFromReader ( reader =>
    reader[ 0 ] is DBNull ? null : reader[ 0 ].ToString ( ) ) );

然后

dgrid_Main.DataSource = binding1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 2021-06-26
    • 2019-12-15
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多