【问题标题】:Set the content of a new row Datagrid设置新行Datagrid的内容
【发布时间】:2012-09-18 21:54:56
【问题描述】:

我有一个 DataGrid 显示一些具有相当多列的数据库。
我希望,当用户编辑新行时,会自动设置一些值。
使用 Windows 窗体 DataGrid 会很容易,因为有 RowsAdded 事件处理程序。 但是我怎么能用 wpf DataGrid 处理这个呢??
编辑:我的 DataGrid 在 Xaml 中绑定到一个 ITable 的公共属性。当用户在 ComboBox 中选择一个表格时,该属性将更新为相应的表格。 是的,有自动生成列,用户输入新行的方式是编辑最后一个空白行(默认行为)。

【问题讨论】:

  • 您究竟是如何添加新行的?您的网格列是自动生成的吗?如果不是,它们与什么有关?

标签: wpf database


【解决方案1】:

您可以在 LoadingRow 事件中执行此操作。试试这样的:

private void myDataGrid_LoadingRow(object sender, System.Windows.Controls.DataGridRowEventArgs e)
{
    MyObject myObject = e.Row.Item as MyObject;
    if (myObject != null)
    {
        myObject.PropertyOne = "test";
        myObject.PropertyTwo = 2;
    }
}

【讨论】:

  • Tahnk 你这可能是一个开始,但问题是任何行都会触发 LoadingRow:所有包含有效数据的行以及在用户编辑最后一行时为用户构建的新行.那么我怎么知道这是一个“新”行呢?显然我可以测试所有对象值是否都是默认值,但这似乎是一个黑客......
【解决方案2】:

好的,我想我明白了。
当 DataTable 绑定到 DataGrid 时,会创建一个 CollectionView 以便查看它。您可以使用(静态/共享)CollectionView.GetDefaultView(ThePropertyThatIsBound) 方法获取它。
由于它实现了 ICollectionChanged,因此您可以将事件处理程序添加到 CollectionChangedEvent。

在 CollectionChanged 事件处理程序中,如果您有一个新项目 (e.NewItems.Count>0),您必须对照 System.Windows.Data.CollectionView.NewItemPlaceholder 检查它,如果它不是占位符,则它是一个全新的项目,我可以设置所有默认值。

【讨论】:

    【解决方案3】:

    CollectionViewSource 分配给您的DataGrid,然后按如下方式监听CollectionChanged 事件:

    ..
    public CollectionViewSource ViewSource { get; set; }
    ..
    this.ViewSource = new CollectionViewSource();
    this.ViewSource.Source = new List<YourObjectType>();
    this.ViewSource.View.CollectionChanged += View_CollectionChanged;
    
    ..
    
    private void View_CollectionChanged(object sender,System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems.Count > 0)
        {
            YourObjectType myObject = e.NewItems[e.NewItems.Count-1] as YourObjectType;
            if (myObject != null)
            {
                myObject.Property        = TheValueYouWant;
                ..
            }
        }
    }
    ..
    <DataGrid ItemsSource="{Binding ViewSource.View}" ../> 
    

    【讨论】:

    • 设置myObject的所有项目的值。只为 DataGrid 中的新项目设置值的方法是什么? (也许检查一下是不是NewItemPlaceholder
    猜你喜欢
    • 1970-01-01
    • 2014-03-17
    • 2016-06-14
    • 2019-07-30
    • 1970-01-01
    • 2010-12-22
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多