我已经创建了多行和多列的数据网格。其中一列是用户可以更改的字段大小列表。如何根据以前的值验证数据网格值
我正在检查旧值的新值,如果新值小于旧值我告诉用户这是无效的,然后我想把旧值重新设置,并重新设置为重点细胞。
我有这行我LostFocus
事件:
System.Windows.Controls.TextBox tbNewSize =
(System.Windows.Controls.TextBox)dtgCell.Content;
当我点击单元格中,LostFocus
事件被称为和工作正常。但是,当我尝试重新调整单元格时,出现一条错误消息:
“无法将类型为”System.Windows.Controls.TextBlock“的对象转换为键入”System.Windows.Controls.TextBox“。
如何解决此问题?
这里是我的XAML代码:
<DataGrid HeadersVisibility="Column" Name="dtGrid" Loaded="GridLoaded" AutoGenerateColumns="False" IsReadOnly="False" VirtualizingPanel.IsVirtualizing="False" Height="365" Width="530" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="54,74,0,0" BorderThickness="1,1,0,1" BorderBrush="Black">
<DataGrid.Columns>
<DataGridTextColumn Header="Field" Binding="{Binding Field, Mode=TwoWay}" Width="209" IsReadOnly="True" />
<DataGridTextColumn Header="Size" Binding="{Binding Size, Mode=TwoWay}" Width="89"/>
<DataGridCheckBoxColumn Header="Right Justify" Binding="{Binding RightJustify, Mode=TwoWay}" Width="55" />
<DataGridCheckBoxColumn Header="Left Justify" Binding="{Binding LeftJustify, Mode=TwoWay}" Width="55" />
<DataGridCheckBoxColumn Header="Left Zero Fill" Binding="{Binding LeftZeroFill, Mode=TwoWay}" Width="55" />
<DataGridCheckBoxColumn Header="Right Zero Fill" Binding="{Binding RightZeroFill, Mode=TwoWay}" Width="65" />
</DataGrid.Columns>
<DataGrid.ColumnHeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock TextWrapping="Wrap" Text="{Binding}"></TextBlock>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<Trigger Property="DataGridCell.IsSelected" Value="True">
<Setter Property="Background" Value="#FF9DF3D6" />
<Setter Property="Foreground" Value="#000000" />
</Trigger>
</Style.Triggers>
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="DataGridCell_PreviewMouseLeftButtonDown" />
<EventSetter Event="LostFocus" Handler="DataGridCell_OnCellLostFocus" />
</Style>
</DataGrid.Resources>
这里是我的C#代码:
private void DataGridCell_OnCellLostFocus(object sender, RoutedEventArgs e)
{
System.Windows.Controls.DataGridCell dtgCell = (System.Windows.Controls.DataGridCell)sender;
if (dtgCell.Column.Header.ToString() == "Size")
{
System.Windows.Controls.TextBox tbNewSize = (System.Windows.Controls.TextBox)dtgCell.Content;
Int32 intNewSize = Convert.ToInt32(tbNewSize.Text);
Int32 intCurrSize = Convert.ToInt32(strFieldInfoOrig[dtGrid.Items.IndexOf(dtGrid.CurrentItem), 1]);
if (intNewSize < intCurrSize)
{
string strMsg;
strMsg = "New size, " + intNewSize.ToString() + " is smaller then the original size, " + intCurrSize.ToString();
strMsg += Environment.NewLine;
strMsg += "Due to potential data loss, this is not allowed.";
System.Windows.MessageBox.Show(strMsg);
//dtgCell.Content = intCurrSize.ToString();
dtgCell.Focus();
}
}
}
我正在上的错误这行'Int32 intCurrSize = Convert.ToInt32(strFieldInfoOrig [dtGrid.Items.IndexOf(dtGrid.CurrentItem),1]);''它防止代码编译 - 你确定这是正确的吗? – Bassie
#Bassue - 这对我有用。在第一次运行时,我输入一个较小的数字,然后进入if语句和错误消息。 – Cass