【问题标题】:Add a DataGrid Row programmatically?以编程方式添加 DataGrid Row?
【发布时间】:2012-07-23 23:30:45
【问题描述】:

我在 wpf 应用程序中创建了一个数据网格(拖放)。然后我通过属性窗口手动添加列。

我现在想通过后面的代码向这个数据网格添加行。我还以为你会做一个

DataGridRow row = new DataGridRow();

然后可能通过 Items.Add() 或您要添加值的东西(每列一个)。

我没有看到这个,所以我想知道我该怎么做。

我知道我应该喜欢数据绑定之类的东西,但我是 wpf 的新手,我正在制作一个快速而肮脏的应用程序,我宁愿只使用 forloop 并手动创建行。

如果我也有这种愿望,我宁愿回来重构该区域。我真的只是想要我正在制作和运行的东西,以便我可以使用它。

【问题讨论】:

    标签: .net wpf datagrid


    【解决方案1】:

    一行是一个对象,值是该对象的属性。你不应该自己创建容器(DataGridRow),DataGrid 可以为你做这件事。只需将数据对象直接添加到Items(或作为ItemsSource的集合集,它应该实现INotifyCollectionChanged(例如ObservableCollection<T>))。列应该绑定数据对象的属性,默认情况下它们是从数据中自动创建的。


    回应评论:使用DisplayNameAttribute,您可以轻松地从标题中取出空格,但您需要将属性添加到所有有问题的属性:

    [DisplayName("Full Name")]
    public string FullName { get; }
    

    然后订阅DataGrid.AutoGeneratingColumn(-哦,文档中有一个解决此问题的hacky解决方案-):

    private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        var descriptor = (MemberDescriptor)e.PropertyDescriptor;
        //Takes the value from the attribute if exists & non-default-value, else property name.
        e.Column.Header = descriptor.DisplayName;
    }
    

    困难的方法是一种算法,它只正确拆分现有的标头字符串(需要考虑帕斯卡大小写、数字和缩写,可能不太容易获得 100% 的准确度)。

    【讨论】:

    • 你能举个例子吗。我不明白为什么我不能手动排。我有一个具有一些属性的对象,我做了 dg.Items.Add(test);并加载了行,但那里什么都没有。所以不确定它是否无法弄清楚列名并绑定,因为它们有点不同或什么)。
    • 我正在尝试将我的列表集合与 ItemSource 一起使用,但我的数据网格中的所有行都是空行
    • @chobo2:属性也需要公开,你也有properties(而不是fields),对吧?如果生成列取决于AutoGenerateColumns(默认为true)。阅读列类的文档以获取有关如何手动设置它们的示例。阅读DataGrid 的文档以及您能找到的任何内容,它会有所帮助
    • 好的,这是缺少的(autoGenerateColumns 设置为 true)。但是,如何覆盖列,以便在列名中放置空格。我也只是使用了一个简单的列表,但我如何理解你写的我需要像 ObserableCollection 一样使用。
    • @chobo2:如果在将项目分配为 ItemsSource 之后添加项目,则只需要一个可观察的集合。我也不知道列名,也许如果你为属性添加DisplayName 属性,不知道DataGrid 是否支持这些。如果您不喜欢自己制作的自动列(请参阅 DataGrid 文档中的示例)。
    猜你喜欢
    • 2014-05-07
    • 2019-04-22
    • 2016-06-17
    • 2012-03-14
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    相关资源
    最近更新 更多