Всем привет, не могу найти решение следующей проблемы. Мне нужен DataGrid c реализованной логикой по нажатию клавиши Enter в ячейках.
Есть следующие колонки:
Номенклатурный номер
Описание
Кол-во
Столбец с кнопкой "удалить"
Логика следующая - вбиваем номенклатурный номер нажимаем Enter, для него(номера) ищется описание в словаре, если находится, то оно прописывается в колонке "Описание" и курсор переходит в колонку "Кол-во". Там вбиваем количество, и перебрасываем фокус ввода на колонку "Номенклатурный номер" новой строки.
Для этого реализовал свой DataGrid
VB.NET
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
Public Class PrintNaklDataGrid
Inherits DataGrid
Sub New()
End Sub
Protected Overrides Sub OnPreviewKeyDown(e As KeyEventArgs)
MyBase.OnPreviewKeyDown(e)
If e.Key = 6 Then
Dim cellInfo As DataGridCellInfo
If Me.CurrentColumn.DisplayIndex = 1 Then
If Not String.IsNullOrWhiteSpace(Me.CurrentItem.descr) AndAlso
CType(Me.DataContext, PrintNaklViewModel).check_dublicate_items(Me.CurrentItem.nomenklat_nomer) = 0 Then
cellInfo = New DataGridCellInfo(Me.CurrentItem, Me.Columns(3))
Else
Dim p As PrintNaklViewModel = Me.DataContext
p.show_hidden_panel = True
p.warning_text = "Заполните номенклатурный номер"
e.Handled = True
Exit Sub
End If
ElseIf Me.CurrentColumn.DisplayIndex = 3 Then
Dim p1 = CType(Me.DataContext, PrintNaklViewModel)
p1.check_add_rows()
If p1.can_add_rows = 1 Then
Dim p As New NaklRowModel
Dim dxt = CType(Me.DataContext, PrintNaklViewModel)
dxt.add_new_nakl_row(1)
cellInfo = New DataGridCellInfo(dxt.NaklRowsSource.Last, Me.Columns(1))
Else
e.Handled = True
Exit Sub
End If
End If
Me.CurrentCell = cellInfo
Me.BeginEdit()
e.Handled = True
End If
End Sub
End Class
C#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
public class PrintNaklDataGrid : DataGrid
{
public PrintNaklDataGrid()
{
}
protected override void OnPreviewKeyDown(KeyEventArgs e)
{
base.OnPreviewKeyDown(e);
if (e.Key == 6) {
DataGridCellInfo cellInfo = default(DataGridCellInfo);
if (this.CurrentColumn.DisplayIndex == 1) {
if (!string.IsNullOrWhiteSpace(this.CurrentItem.descr) && ((PrintNaklViewModel)this.DataContext).check_dublicate_items(this.CurrentItem.nomenklat_nomer) == 0) {
cellInfo = new DataGridCellInfo(this.CurrentItem, this.Columns(3));
} else {
PrintNaklViewModel p = this.DataContext;
p.show_hidden_panel = true;
p.warning_text = "Заполните номенклатурный номер";
e.Handled = true;
return;
}
} else if (this.CurrentColumn.DisplayIndex == 3) {
dynamic p1 = (PrintNaklViewModel)this.DataContext;
p1.check_add_rows();
if (p1.can_add_rows == 1) {
NaklRowModel p = new NaklRowModel();
dynamic dxt = (PrintNaklViewModel)this.DataContext;
dxt.add_new_nakl_row(1);
cellInfo = new DataGridCellInfo(dxt.NaklRowsSource.Last, this.Columns(1));
} else {
e.Handled = true;
return;
}
}
this.CurrentCell = cellInfo;
this.BeginEdit();
e.Handled = true;
}
}
}
Раскрашиваю DataGrid следующим образом:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
<inputDataGrid:PrintNaklDataGrid x:Name="inputDGW"
ItemsSource="{Binding NaklRowsSource}"
Width="auto"
AutoGenerateColumns="False"
CanUserReorderColumns="False"
CanUserSortColumns="False"
CanUserAddRows="False"
HeadersVisibility="Column"
FontSize="20"
Height="auto"
SelectionUnit="Cell"
BorderThickness ="0"
Background="Transparent"
GridLinesVisibility="None"
FontFamily="Tahoma">
<inputDataGrid:PrintNaklDataGrid.Resources >
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Margin" Value="3,3,0,3"/>
<Setter Property="BorderBrush" Value="Blue"/>
<Setter Property="BorderThickness" Value="0,3,0,3"/>
<Setter Property="ContentTemplate">
<Setter.Value >
<DataTemplate >
<TextBlock Foreground="black" TextWrapping="Wrap"
Text="{Binding Column.Header, RelativeSource={RelativeSource AncestorType={x:Type DataGridColumnHeader}}}"/>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</inputDataGrid:PrintNaklDataGrid.Resources>
<inputDataGrid:PrintNaklDataGrid.Columns>
<DataGridTextColumn Header="№" Binding="{Binding n_nomer,UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="Background" Value="#FF0EDEFF"></Setter>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Номенклатурный номер" MaxWidth="170"
Binding="{Binding nomenklat_nomer,UpdateSourceTrigger=PropertyChanged}" >
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="Background" Value="#FF0EDEFF"/>
</Style>
</DataGridTextColumn.ElementStyle>
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="TextBox">
<Setter Property="Background" Value="#4C0EDEFF"/>
<Setter Property="Foreground" Value="DarkGray"/>
</Style>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Наименование" MinWidth="380" Binding="{Binding descr,UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="Background" Value="#FF0EDEFF"></Setter>
</Style>
</DataGridTextColumn.ElementStyle>
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="TextBox">
<Setter Property="Background" Value="#FF2BCB9F"></Setter>
</Style>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Кол-во" Binding="{Binding cnt,UpdateSourceTrigger=PropertyChanged}">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="Background" Value="#FF0EDEFF"></Setter>
</Style>
</DataGridTextColumn.ElementStyle>
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="TextBox">
<Setter Property="Background" Value="#4C0EDEFF"/>
<Setter Property="Foreground" Value="DarkGray"/>
</Style>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>
<DataGridTemplateColumn Width="auto" Header="Удалить" >
<DataGridTemplateColumn.CellTemplate >
<DataTemplate >
<Border Background="#FF0EDEFF" >
<Button Style="{StaticResource delete_style_button}" />
</Border>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</inputDataGrid:PrintNaklDataGrid.Columns>
</inputDataGrid:PrintNaklDataGrid>
Проблема следующая:
если я нахожусь в ячейке "Номенклатурный номер" при редактировании, отрабатывает стиль
1.
2.
3.
4.
5.
6.
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="TextBox">
<Setter Property="Background" Value="#4C0EDEFF"/>
<Setter Property="Foreground" Value="DarkGray"/>
</Style>
</DataGridTextColumn.EditingElementStyle>
при нажатии на Enter стиль ячейки возвращается на
1.
2.
3.
4.
5.
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="Background" Value="#FF0EDEFF"/>
</Style>
</DataGridTextColumn.ElementStyle>
и фокус попадает на столбец "Кол-во". Вводим кол-во, стиль становится как для редактирования, нажимаем Enter, переходим на новую строку и стиль ячейки кол-во , из которой только что ушли не меняется на DataGridTextColumn.ElementStyle. Если 2 раза кликнуть на эту ячейку, то стиль редактирования пропадает. Причем никак не пойму, почему в столбце "Номенклатурный номер" все отрабатывает нормально, а в "Кол-во" стиль редактирования зависает.