【问题标题】:Selected Row in DataGrid has been lostDataGrid 中的选定行已丢失
【发布时间】:2019-12-07 17:52:18
【问题描述】:

我有一个 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”时,我应该尝试几次来执行它的事件。通常在下面的代码中显示消息框

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");
        }
    }   

【问题讨论】:

  • 在你的问题list because of updating the selected row 你的意思是你正在更新另一个数据网格选择?
  • 不,这个当前列表更新得非常快,当你右键单击特定行并从它的 contextMenu 中选择 addToReportedList 时,它的事件已经显示了消息框

标签: c# wpf


【解决方案1】:

我会说,DataGrid 在您的情况下对于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");
    }
}

【讨论】:

  • 感谢您的回答,但问题尚未解决。我在选择后一直使用列表的临时副本解决了它,但我正在寻找最佳解决方案。
【解决方案2】:

当您的ItemSource 更新时,您的DataGridSelectedItem 被清除。因此,您可以将SelectionChanged 事件添加到您的DataGrid,并且您需要将您的SelectedItem 分配给代码隐藏中的局部变量,然后将局部变量添加到第二个DataGrid

【讨论】:

    猜你喜欢
    • 2012-11-05
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 2015-01-23
    • 2012-09-12
    • 1970-01-01
    • 2023-03-23
    • 2014-07-19
    相关资源
    最近更新 更多