C#的wpf工程中由于datagrid中的数据一直在更新所以每次选中某一行时,数据一更新选中就会被取消掉

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#的wpf工程中由于datagrid中的数据一直在更新所以每次选中某一行时,数据一更新选中就会被取消掉相关的知识,希望对你有一定的参考价值。

我现在需要获取到我选中的那一行的内容该怎么去做

这个取决于你的“更新”,是什么概念了。
WPF不同于WINFORM,前端的datagrid中的item其实就是ViewModel层的一个个数据,
因为你是在“更新”中,所以如果你选中的这个item在下次更新的时候没有了,(比如不存在了),那么你选中的行肯定是会被消掉的。这个也没有任何获取的意义, 硬要获取的话,建议你添加一个事件,SeletionChanged,即当你选择一行的时候,直接拿到这个item,然后处理去,就不再关注前端UI了。

如果你的数据是累加的,即每次更新后,上次的数据还在, 那么是可以保留选中的啊,
我写的测试程序如下, 前端的DataGrid名字叫 DataDg:

public delegate void SysBusyDelegate(bool isbusyt);//声明一个委托
public event SysBusyDelegate sysbusyEvent = null;

private ObservableCollection<KeyValuePair<string, string>> _item = null;
//声明了一个集合,集合就是最简单的键值对
public IList<KeyValuePair<string, string>> Items

get return _item ?? (_item = new ObservableCollection<KeyValuePair<string, string>>());

public MainWindow()

InitializeComponent();
DataDg.ItemsSource = Items;
Binding();

void Binding()

var thread = new System.Threading.Thread(new System.Threading.ThreadStart(() =>

for (int i = 0; i < 100; i++)

Thread.Sleep(1000);
sysbusyEvent.Invoke(false);


)) IsBackground = true ;
thread.Start();

sysbusyEvent += (state) =>

Application.Current.Dispatcher.Invoke(new Action(() =>

if (state == false)


var gid = Guid.NewGuid().ToString();
Items.Add(new KeyValuePair<string, string>(gid, gid));

));
;


//我通过后台线程 循环100次,每秒加一个新的项进入DATAGRID. 运行后的效果就是DataGrid一直在累加, 但是我选中的项一直都在, 不会消失或者失去焦点。追问

你的一百次用的是add每次添加一行数据,和我的情况不同,我的是现在已经有了100条数据了,知识这100 条数据的内容实时的在发生变化,就会出现选中被取消,我如果把实时变化关掉选中时没问题的,还有就是你说的selectionchanged的触发事件是什么?

追答

就是第一种情况了,数据源一直在改变。
DataGrid有一个事件,叫选项变更

后台会有一个SelectedSomeRow方法,就是当你选中某一行的时候就会触发。
private void SelectedSomeRow(Sender sender,EventArg e)

//在这里面处理你的选中项
var item = Dg.SelectedItem as (你绑定的类型);
//对item 进行处理即可。

参考技术A 记下唯一标志,刷新后重新选中

窗口消息框中的 C# WPF XAML

【中文标题】窗口消息框中的 C# WPF XAML【英文标题】:C# WPF XAML In Window Messages Boxes 【发布时间】:2016-06-09 14:47:21 【问题描述】:

我是 C# WPF 的新手,我创建了一个 Popup 窗口,其中包含一个 DataGrid 来保存一些数据。在某些情况下,如果数据中有任何错误,我想在窗口底部的同一个弹出窗口中显示此错误(参见屏幕截图)。这个想法是用户可以然后单击确定,消息将消失,再次显示完整的数据网格。

有人知道怎么做吗?

我不想在单独的窗口中出现另一个弹出消息框,我希望所有消息都显示/堆叠在与数据网格相同的弹出窗口中。

【问题讨论】:

以下链接将帮助您重叠消息容器***.com/questions/5450985/… 然后在按钮单击时通过visibility="collapsed" 隐藏容器 【参考方案1】:

下面,XAML 中有 2 个网格:主网格包含 DataGrid,另一个网格包含错误 UI。错误网格通常是折叠的(Visibility 设置为 Visibility.Collapsed)。

当需要显示错误信息时,将错误网格的Visibility设置为Visibility.Visible,即显示网格。当用户点击“关闭”按钮时,错误网格的Visibility 设置为Visibility.Collapsed

没有单独的窗口或弹出窗口。一切都包含在主视图中。

XAML:

  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition/>
      <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <DataGrid>
    </DataGrid>
    <Button Grid.Column="1" Content="Show Message Window" VerticalAlignment="Center" Click="Button_Click_1"/>
    <!-- This is the "error grid"-->
    <Grid VerticalAlignment="Bottom" Height="Auto" 
       Background="AliceBlue" Visibility="Collapsed" Name="grdError">
      <TextBlock Text="Oops.  This is an error!"/>
      <Button Content="Dismiss" HorizontalAlignment="Right" Click="Button_Click_3"/>
    </Grid>
  </Grid>

代码背后:

  public partial class MainWindow : Window
  
    public MainWindow()
    
      InitializeComponent();
    

    private void Button_Click_1(object sender, RoutedEventArgs e)
    
      grdError.Visibility = Visibility.Visible;
    

    private void Button_Click_3(object sender, RoutedEventArgs e)
    
      grdError.Visibility = Visibility.Collapsed;
    
  

【讨论】:

谢谢。让我试试这个!

以上是关于C#的wpf工程中由于datagrid中的数据一直在更新所以每次选中某一行时,数据一更新选中就会被取消掉的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WPF C# 中的 DataGrid 的 TextBoxes 中获取选定的行值

c# wpf datagrid中选择所有复选框的代码

C# WPF DataGrid 时间字段 显示AM PM,我想飞改成24小时格式。例如:2017/12/1 17:43:53

在 C# WPF 中从 MySQL 数据库中填充 dataGrid

WPF C# DataGrid 绑定到存储过程

如何在 WPF 中设置 DataGrid 的 DataSource?