【问题标题】:WPF DataGrid cell outlined in Red? (Noobie)WPF DataGrid 单元格以红色标出? (努比)
【发布时间】:2011-03-03 20:19:43
【问题描述】:

首先我要说我对 WPF 完全陌生。但是,我确实有 20 年的开发经验和大约 5 年的 C# webform 经验。

我正在尝试诊断使用 DataGrid 控件的 WPF 应用程序。

我将尝试描述此应用程序中正在发生的场景..

以下是产生“错误”的步骤。我想弄清楚发生了什么:

用户向 DataGrid 表中添加一行。 用户将第一列 (Qty) 更改为 1。 跨列的用户选项卡。 一旦光标经过“折扣百分比”列并进入下一列。 此时,“折扣百分比”单元格变为红色轮廓。 在“固定”“折扣百分比”列之前,不能编辑其他单元格。 有趣的是,你可以清除单元格并输入相同的数据,红色就消失了。

我想这可能是因为该字段是一个“百分比”字段(当您输入 .10 时,当您离开单元格时它变为“10 %”),但同样的事情发生在另一个(纯文本/varchar ) 列。

我注意到的其他奇怪的事情:

如果用户没有在 Qty 单元格中输入任何内容,而只是在所有列中直接使用制表符,直到最后,所有单元格都不会变红。

如果用户在 Discount Pct 单元格上单击(而不是选项卡)(无论是否输入了数量),然后离开该单元格(通过单击或选项卡),该单元格不会变成红色。

有什么想法吗?我想有某种类型的单元验证失败,但为什么只在这些特定情况下?

您将如何诊断?我能以某种方式显示验证错误吗(我确信必须有一个我可以绑定的处理程序),也许这会告诉我一些事情。

想法?想法?

为每个请求添加代码:

        <DataGrid x:Name="myDataGrid" 
              ItemsSource="{Binding}" 
              CanUserAddRows="False" 
              CanUserDeleteRows="True" 
              CanUserResizeRows="False"
              SelectionUnit="CellOrRowHeader" 
              ColumnHeaderStyle="{StaticResource lclDataGridColumnHeaders}"
              RowHeaderStyle="{StaticResource lclDataGridRowHeaders}" 
              CellStyle="{StaticResource lclDataGridCellStyle}"
              HorizontalGridLinesBrush="LightBlue" 
              VerticalGridLinesBrush="LightBlue" 
              AutoGeneratingColumn="DataGrid_AutoGeneratingColumn" 
              Loaded="DataGrid_Loaded" 
              LoadingRow="DataGrid_LoadingRow"
              CurrentCellChanged="DataGrid_CurrentCellChanged"
              CellEditEnding="DataGrid_CellEditEnding">
    </DataGrid>

我想出了如何将样式应用于“EditCell”并使用以下内容(来自另一个站点):

        <Style x:Key="lclDataGridCellEditStyle" TargetType="{x:Type TextBox}">
        <Setter Property="BorderThickness" Value="0"/>
        <Setter Property="Padding" Value="0"/>
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="ToolTip"
                        Value="{Binding RelativeSource={RelativeSource Self},
                                Path=(Validation.Errors)[0].ErrorContent}"/>
            </Trigger>
        </Style.Triggers>
    </Style>

然后,我将它分配给数据网格上的 EditingElementStyle(在后面的代码中)。

生成的验证错误(证实了我的怀疑)是:“无法转换值 '10 %'”。

这是有道理的,因为它希望用户输入“.10”或类似的东西(float/double/decimal/etc)...没有“%”(将条目视为字符/文本)。

问题是,此行已“导入”(从另一个表复制)到 DataGrid 中,因此该字段已被填充。那么,我怎样才能让 DataGrid 只接受“编辑值”的“显示值”(在这里抛出术语并猜测)?

而且,为什么只有当您更改数量单元格然后通过它切换时,才会出现此验证错误?

稍后会详细介绍其他领域...一旦我“解决”了这个问题,我怀疑解决方案会类似...

我可以提供更多代码,但有很多。我试图只提供必要的东西。如果我可以发布其他代码(例如非常基本的 AutoGeneratingColumn),请告诉我!

新信息...我猜在更改数量后出现红色框的原因是因为这会触发行更改,从而进行验证。而且,为了解决我上面描述的百分比场景,看起来我需要实现一个“转换器”,如下所述:http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx

另一个更新....

这行得通。我将转换器添加到百分比字段,现在一切都很好。

给我带来问题的另一个字段是允许空值的“整数”列。导入记录时,该列为空,但显然 DataGridTextColumn 希望整数不为空。有没有我可以设置为允许空值的属性?或者,我是否只需要做另一个转换器来在..um... null (string) 和 int 之间进行转换?哈哈

谢恩

【问题讨论】:

  • 有一些代码要显示吗?这会有所帮助。
  • 您能否发布DataGrid 的相关代码以及您可能正在使用的任何验证代码?

标签: wpf datagrid wpfdatagrid


【解决方案1】:

您也许可以拥有一个 int 类型的列?这将允许空值。

【讨论】:

  • 是的,这就是我假设 AutoGenerateColumns 将“绑定”列的方式,因为数据库列是 int 类型并且允许空值。显然,它不会注意到列是否应该允许 NULLS...
猜你喜欢
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2011-09-04
  • 2023-01-13
  • 2011-08-07
  • 2015-12-16
相关资源
最近更新 更多