Ich habe ein Datagrid aus mehreren Zeilen und Spalten erstellt. Eine der Spalten ist eine Liste von Feldgrößen, die der Benutzer ändern kann.So validieren Sie den Wert von datagridcell basierend auf dem vorherigen Wert
Ich überprüfe den neuen Wert gegen den alten Wert und wenn der neue Wert kleiner ist als der alte Wert, sage ich dem Benutzer, das ist nicht gültig und dann möchte ich den alten Wert zurück setzen und den Fokus darauf zurücksetzen Zelle.
Ich habe diese Zeile in meinem LostFocus
Veranstaltung:
System.Windows.Controls.TextBox tbNewSize =
(System.Windows.Controls.TextBox)dtgCell.Content;
Wenn ich auf die Zelle klicken, wird das LostFocus
Ereignis aufgerufen und funktioniert einwandfrei. Jedoch wenn ich versuche, an die Zelle refokussieren bekomme ich eine Fehlermeldung,
„Kann nicht das Objekt des Typs‚System.Windows.Controls.TextBlock‘werfen‚System.Windows.Controls.TextBox‘zu geben.“
Wie behebe ich dieses Problem?
Hier ist meine XAML-Code:
<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>
Hier ist mein C# -Code:
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();
}
}
}
ich eine Störung erhalte auf Diese Zeile 'Int32 intCurrSize = Convert.ToInt32 (strFieldInfoOrig [dtGrid.Items.IndexOf (dtGrid.CurrentItem), 1]);' verhindert die Kompilierung des Codes - sind Sie sicher, dass das korrekt ist? – Bassie
#Bassue - Das funktioniert für mich. Beim ersten Durchlauf gebe ich eine kleinere Zahl ein und ich komme in die if-Anweisung und die Fehlermeldung. – Cass