【问题标题】:unable to edit DataGridView populated with results of LINQ query无法编辑填充了 LINQ 查询结果的 DataGridView
【发布时间】:2010-02-22 15:00:31
【问题描述】:

当我使用 linq-to-xml 查询的结果来填充 datagridview 时,我无法编辑 datagridview。我尝试将 datagridview 的 readonly 属性设置为 false,但这没有帮助。我还为 cellBeginEdit 添加了一个事件处理程序并在那里放置了一个断点,但它没有被命中。知道我做错了什么,或者这不可能吗?

public class MergeEntry
{
  public string author    { get; set; }
  public string message   { get; set; }
}
...
var query = from entry in xmlDoc.Descendants("entry")
            select new MergeEntry
            {
              author = entry.Element("author").Value,
              message = entry.Element("msg").Value,
            }
var queryAsList = query.ToList();

myBindingSource.DataSource = queryAsList;
myDataGridView.DataSource = myBindingSource;

【问题讨论】:

    标签: c# winforms linq datagridview linq-to-xml


    【解决方案1】:

    是的,可以绑定到从 Linq-To-Xml 创建的列表。我试图重现你的问题。我做了以下事情:

    1. 创建了一个空的 WindForm 项目(VS 2008 和 .Net 3.5)
    2. 向表单添加了 DataGridView。
    3. 连接 CellBeginEdit 和 CellEndEdit。
    4. 将以下代码放入表单的构造函数中

    string testXML =
            @"<p><entry>
              <author>TestAuthor1</author>
              <msg>TestMsg1</msg>  
              </entry></p>
            ";
    
    XElement xmlDoc = XElement.Parse(testXML);
    
    var query = from entry in xmlDoc.Descendants("entry")
                select new MergeEntry
                {
                    author = entry.Element("author").Value,
                    message = entry.Element("msg").Value,
                }; //You were missing the ";" in your post, I am assuming that was a typo.
    
    //I first binded to a List, that worked fine. I then changed it to use a BindingList
    //to support two-way binding.
    var queryAsList = new BindingList<MergeEntry>(query.ToList());
    
    bindingSource1.DataSource = queryAsList;
    dataGridView1.DataSource = bindingSource1;
    

    在运行 WinForm 应用程序时,会显示一个可编辑的网格,并且应该触发 CellBeginEdit 和 CellEndEdit 事件。希望尝试使用上述步骤重现将帮助您找到您面临的问题。

    【讨论】:

      【解决方案2】:

      由于您使用的是ToList,因此您的DataSource 实际上是List&lt;MergeEntry&gt;,因此它来自Linq 查询这一事实不会改变任何事情。我怀疑列(不是 DGV)的 ReadOnly 属性设置为 true ......我看不出网格不可编辑的其他原因

      【讨论】:

        【解决方案3】:

        此解决方案可能效率不高,但对我有用, 我将所有数据(来自 LINQ)移动到一个新集合中,并将该新集合作为数据源传递给 gridview。 现在 gridview 允许我们编辑单元格。

        【讨论】:

          猜你喜欢
          • 2019-08-28
          • 1970-01-01
          • 1970-01-01
          • 2011-02-08
          • 2014-01-05
          • 1970-01-01
          • 2010-09-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多