我有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
}
}
}
答案 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 ,但无法正确解决。