首页 > 解决方案 > DataGrid 中的选定行已丢失

问题描述

我有一个 DataGrid,他们的行更新得非常快。每行都有一个右键单击事件,如果单击该事件,则应将此选定的行添加到另一个 dataGrid。问题是当用户选择一行以添加到另一个列表时,因为更新了选定的行,他无法添加,所以用户应该一次又一次地选择该行。我的代码是这样的

       <DataGrid SelectionMode="Single" CanUserAddRows="False"CanUserDeleteRows="False"  >

            <DataGrid.Columns>
                <DataGridTextColumn   Header="Data1"  Binding="{Binding Path=Data1}"></DataGridTextColumn>
                <DataGridTextColumn   Header="Data2"  Binding="{Binding Path=Data2}"></DataGridTextColumn>
                <DataGridTextColumn   Header="Data3"  Binding="{Binding Path=Data3}"></DataGridTextColumn>
                <DataGridTextColumn   Header="Data4" Binding="{Binding Path=Data4}"></DataGridTextColumn>
                <DataGridTextColumn   Header="Data5" Binding="{Binding Path=Data5}"></DataGridTextColumn>
                <DataGridTextColumn   Header="Data6" Binding="{Binding Path=Data6}"></DataGridTextColumn>

            </DataGrid.Columns>

            <DataGrid.ContextMenu>
                <ContextMenu HorizontalContentAlignment="Right" FlowDirection="RightToLeft">

                    <MenuItem Name="addToBlackListMnuBtn" Header="Add to Black List" Click="addToBlackListMnuBtn_Click" FontWeight="Black"/>
                    <MenuItem Name="addtoReportedListMnuBtn" Header="Add to Reported List"  Click="addtoReportedListMnuBtn_Click" FontWeight="Black"/>

                </ContextMenu>
            </DataGrid.ContextMenu>

        </DataGrid>

当我想从 contexMenu 中单击“addtoReportedListMnuBtn”时,我应该尝试几次来执行它的事件。通常从下面的代码中显示 messageBox

private void addtoReportedListMnuBtn_Click(object sender, RoutedEventArgs e)//add to reported list
    {
        ObjClass en = (ObjClass)ActiveSignalDataGrid.SelectedItem;
        if(en!=null)
        {
            ReportSignalsListQ.Data = en; // add to queue for adding 
        }else
        {
            MessageBox.Show("Please select again");
        }
    }   

标签: c#wpf

解决方案


我会说,DataGrid在你的情况下, a 是一个错误的地方ContextMenu。将您的资源放到ContextMenu窗口的资源中并将其用于DataGridCell.

<Window.Resources>
    <ContextMenu x:Key="contMen" HorizontalContentAlignment="Right" FlowDirection="RightToLeft">
        <MenuItem Name="addToBlackListMnuBtn" Header="Add to Black List" Click="addToBlackListMnuBtn_Click" FontWeight="Black"/>
        <MenuItem Name="addtoReportedListMnuBtn" Header="Add to Reported List"  Click="addtoReportedListMnuBtn_Click" FontWeight="Black"/>
    </ContextMenu>
</Window.Resources>


<DataGrid.Resources>
    <Style TargetType="DataGridCell">
        <Setter Property="ContextMenu" Value="{StaticResource contMen}"/>                        
    </Style>
</DataGrid.Resources>

private void addtoReportedListMnuBtn_Click(object sender, RoutedEventArgs e)//add to reported list
{
    var en = (((sender as MenuItem).Parent as ContextMenu).PlacementTarget as DataGridCell).DataContext as ObjClass;
    if (en != null)
    {
        ReportSignalsListQ.Data = en; // add to queue for adding 
    }
    else
    {
        MessageBox.Show("Please select again");
    }
}

推荐阅读