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 进行处理即可。
窗口消息框中的 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 时间字段 显示AM PM,我想飞改成24小时格式。例如:2017/12/1 17:43:53