Проблема с обработкой событий внутри сетки данных. - PullRequest
0 голосов
/ 15 августа 2011

Я не знаю, почему я сталкиваюсь со странной ситуацией в датагриде через день. На этот раз это действительно раздражает. Поэтому я пытался обработать клавишу Enter внутри сетки данных, но, похоже, возникла проблема. Как мы знаем, стандартное поведение клавиши Enter в сетке данных - это перемещение вниз по строке, в то время как я хотел сделать что-то еще, теперь я не знаю почему, но даже если я переопределил это поведение с помощью события keydown, он отказывается это делать. Вот код xaml:

<DataGrid Grid.Row="1" AutoGenerateColumns="False" x:Name="dataGrid1" VerticalAlignment="Stretch" CanUserReorderColumns="False" GridLinesVisibility="Horizontal" HorizontalGridLinesBrush="White" VerticalGridLinesBrush="White" Background="Transparent" Foreground="White" CanUserResizeRows="False" Margin="8,0,8,48" BorderBrush="White" BorderThickness="2" RowBackground="#FF008284" MinRowHeight="5" FontSize="14" ItemsSource="{Binding  }" Grid.RowSpan="2"   SelectionMode="Single" SelectionUnit="FullRow" KeyDown="dataGrid1_KeyDown" SelectedIndex="0">
    <DataGrid.Resources>
        <Style TargetType="{x:Type DataGridColumnHeader}">
            <Setter Property="VerticalContentAlignment" Value="Center"/>
            <Setter Property="VerticalAlignment" Value="Stretch"/>
            <Setter Property="Background" Value="#FF008284"/>
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="Visibility" Value="Visible"/>
            <Setter Property="Height" Value="40"/>

            <Setter Property="HorizontalAlignment" Value="Stretch"/>
            <Setter Property="HorizontalContentAlignment" Value="Center"/>
            <Setter Property="BorderThickness" Value="1,1,1,1"/>
            <Setter Property="BorderBrush" Value="White"/>
        </Style>
        <Style TargetType="{x:Type DataGridCell}">
            <Setter Property="BorderThickness" Value="1,0,1,0"/>
            <Setter Property="BorderBrush" Value="White" />
            <Setter Property="TextBlock.TextAlignment" Value="Center" />
            <Setter Property="Height" Value="30"/>
            <Setter Property="HorizontalContentAlignment" Value="Right"/>
            <Setter Property="TextBlock.FontSize" Value="14" />
        </Style>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn Width="80*" Header="Date"   CanUserResize="False" CanUserReorder="False" CanUserSort="False" Binding="{Binding Path= date}" IsReadOnly="True"/>

        <DataGridTextColumn Width="80*" Header="Payment" CanUserResize="False" CanUserReorder="False" CanUserSort="False" Binding="{Binding Path= Payment}" FontSize="16" IsReadOnly="True"/>
        <DataGridTextColumn Width="80*" Header="Receipt" CanUserResize="False" CanUserReorder="False" CanUserSort="False" Binding="{Binding Path= Receipt}" FontSize="16" IsReadOnly="True"/>
        <DataGridTextColumn Width="80*" Header="Balance" CanUserResize="False" CanUserReorder="False" CanUserSort="False" Binding="{Binding Path= Balance}" FontSize="16" IsReadOnly="True"/>
        <DataGridTextColumn Width="80*" Header="Debit" CanUserResize="False" CanUserReorder="False" CanUserSort="False" Binding="{Binding Path= Debit}" FontSize="16" IsReadOnly="True"/>
        <DataGridTextColumn Width="80*" Header="Credit" CanUserResize="False" CanUserReorder="False" CanUserSort="False" Binding="{Binding Path= Credit}" FontSize="16" IsReadOnly="True" />
    </DataGrid.Columns>
</DataGrid>

и вот код, то есть, который должен быть вызван:

private void dataGrid1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        String date = (dataGrid1.Items[(dataGrid1.SelectedIndex-1)] as DailyTransaction).date

        EnterTransaction transaction = new EnterTransaction(DateTime.Parse(date));

        transaction.ShowDialog();
        ListofTransaction.reloadData();
        return;
    }
    else if (e.Key == Key.F2)
    {
        insertNewRow();
        return;
    }
    else if (e.Key == Key.C)
    {
        ignoreSundays = true;
        insertNewRow();
        ignoreSundays = false;

    }
    else if (e.Key == Key.Escape)
    {
        this.Close();
    }
}

Теперь интересно, что Escape key прекрасно работает в этом сценарии. Я не знаю, в чем здесь проблема, или, может быть, мне не хватает чего-то очень простого ??

Ответы [ 2 ]

1 голос
/ 15 августа 2011

Используйте PreviewKeyDown вместо KeyDown

<DataGrid PreviewKeyDown="dataGrid_PreviewKeyDown"
          ... />

Обработчик событий

private void dataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        // Do stuff..
        e.Handled = true;
    }
}
0 голосов
/ 15 августа 2011

В дополнение ко всем другим сообщениям, я настоятельно рекомендую в этом случае, когда вы собираетесь переопределить поведение по умолчанию, создать свой класс DataGrid, унаследовав его от BCL, и ПЕРЕЗАГРУЗИТЬ событие, а не просто подписаться на него.

Сначала в этом случае запускается встроенный код, а после возникает событие, поэтому ваш код выполняется.Переопределив событие в производном классе, вы можете изменить поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...