WPF:如果添加了新行,如何在DataGrid中设置不同的默认空值?

时间:2016-09-07 08:41:44

标签: c# wpf datagrid

我有DataGrid绑定到由DataTable填充的SqlDataAdapter,其中填充了未指定的表格,因此我无法知道表中的结构是。我已将TargetNullValue设置为"NULL",并且数据库中包含空值的单元格在DataGrid中显示为NULL,这是完美的。

但是......当我想使用DataGrid的{​​{1}}添加新行时,默认值都是“NULL”,我希望它们为空。

我能够更改期望CanUserAddRow类型显示为空的单元格,但是在期望string的单元格中,它不能包含空字符串,或者int int。如果我希望它为NULL,则必须为NULL,这会在单元格中给出“NULL”,这没有任何区别。

任何一个有想法如何克服我的这个问题的人?

提前致谢。

Mainwindow.xaml

DBNull

Mainwindow.xaml.cs

<DataGrid x:Name="dataGrid_Table" AutoGenerateColumns="True" CanUserAddRows="true" AutoGeneratingColumn="dataGrid_Table_AutoGeneratingColumn" InitializingNewItem="dataGrid_Table_InitializingNewItem"/>

填充DataTable并将其绑定到DataGrid的方法

private void dataGrid_Table_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        // Make all columns nullable
        ((DataGridBoundColumn)e.Column).Binding.TargetNullValue = "NULL";
    }

    private void dataGrid_Table_InitializingNewItem(object sender, InitializingNewItemEventArgs e)
    {
        DataRowView drv = (DataRowView)e.NewItem;

        for (int i = 0; i < drv.Row.ItemArray.Count(); i++)
        {
            DataColumn col = drv.Row.Table.Columns[i];

            if (col.DataType.ToString() == "System.String")
            {
                drv.Row[i] = "";
            }
            else if (col.DataType.ToString() == "System.Int32")
            {
                // Set cells that expect an int to show up empty
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

我有一个类似的设置,其中 SqlDataAdapter 正在填充 DataGrid 。我需要将 Boolean 字段显示在DataGrid上,但是似乎该行中每个列值的默认值始终为NULL。 UI中的布尔NULL值看起来像一个复选框,它错误地表示了实际值。

我找到了一个看起来有些混乱的解决方案,但是可以完成工作。

您要将 LoadingRow 选项添加到 DataGrid XAML

    <DataGrid .... LoadingRow="myDataGrid_LoadingRow" />

这将在创建行的某个时间出现。这是否是新行。因此,如果您有一个具有100行的数据网格,则在加载每一行时它将调用此函数100次。所以我在这里做了几件事:

(1)确保 e.Row.Item DataRowView 对象,以避免引发错误

(2)检查是否使用 .IsNew 创建了该行,从而避免了原始行列表中的所有行

(3)将对象强制转换为 System.Data.DataRowView 时,您将能够拉出该行的将来值。我有静态列,因此11和10是我的列。我需要将新行的值设置为false,但是您可以输入所需的任何值(如果希望使用“”将其为空)

    private void myDataGrid_LoadingRow(object sender, System.Windows.Controls.DataGridRowEventArgs e)
    {
        if (e.Row.Item is System.Data.DataRowView)
        {
            if (((System.Data.DataRowView)e.Row.Item).IsNew)
            {
                ((System.Data.DataRowView)e.Row.Item)[11] = false;
                ((System.Data.DataRowView)e.Row.Item)[10] = false;
            }
        }
    }

我也尝试使用 LoadingRow ,但无法正确解决。