public MainWindows()
{
InitializeComponent();
Init_tReflashData();
}
private void Init_tReflashData()
{
string sHostIP = ConfigurationManager.AppSettings["HostIP"].ToString();
string sHostPort = ConfigurationManager.AppSettings["HostPort"].ToString();
grpcService = new GrpcServiceClient(sHostIP, sHostPort);
_t.Interval = new TimeSpan(Class._INTERVAL_SEC_5);
_t.Tick += _tFirstResultList_Tick;
bEnableThrd = true;
_t.Start();
}
private void _tFirstResultList_Tick(object sender, EventArgs e)
{
try
{
if (bEnableThrd)
{
// Check whether base object exist or not
if (grpcService.IsHostChannelReadyAsync(DateTime.UtcNow.AddSeconds(1)))
{
_t.Interval = new TimeSpan(Cl._TIMESPAN_INTERVAL_SEC_5);
datagrid.ItemsSource = null;
datagrid.ItemsSource = InfoLists;
}
else
{
_t.Stop();
_t = null;
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
private void _tResultList_Tick(object sender, EventArgs e)
{
try
{
if (bEnableThrd)
{
// Check whether base object exist or not
if (grpcService.IsHostChannelReadyAsync(DateTime.UtcNow.AddSeconds(1)))
{
_t.Interval = new TimeSpan(Class._TIMESPAN_INTERVAL_SEC_5);
NewWindows obj = new NewWindows(datagrid.SelectedItems);
}
else
{
_t.Stop();
_t = null;
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
private void DataGridName_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
Dispatcher.Invoke(new Action(() =>
{
int rowIndex = datagrid.Items.IndexOf(datagrid.CurrentItem);// 获取选中单元格所在的行号
DataGridCell cell = sender as DataGridCell;
if (rowIndex >= 0)
{
datagrid.SelectedCellsChanged -= DataGridName_SelectedCellsChanged; // 取消事件处理程序
datagrid.SelectedItems.Clear();
for (int i = rowIndex; i < rowIndex + 5; i++) //开始选中5行
{
DataGridRow selectedRow = (DataGridRow)datagrid.ItemContainerGenerator.ContainerFromIndex(i);
if (selectedRow != null)
{
selectedRow.IsSelected = true;
}
datagrid.SelectedItems.Add(datagrid.Items[i]);
}
datagrid.SelectedCellsChanged += DataGridName_SelectedCellsChanged; // 重新启用事件处理程序
}
List<object> selectedItems = new List<object>();
foreach (var item in datagrid.SelectedItems)
{
bool isContain = false;
for (int i = 0; i < datagrid.Columns.Count; i++)
{
string value = (datagrid.Columns[i].GetCellContent(item) as TextBlock).Text;
if (value.Length==10)
{
isContain = true;
break;
}
}
if (!isContain)
{
selectedItems.Add(item);
}
}
datagrid.SelectedCellsChanged -= DataGridName_SelectedCellsChanged;
datagrid.SelectedItems.Clear();
foreach (var item in selectedItems)
{
datagrid.SelectedItems.Add(item);
}
datagrid.SelectedCellsChanged += DataGridName_SelectedCellsChanged;
if (!isNewWindowOpen)
{
isNewWindowOpen = true;
NewWindows obj = new NewWindows(datagrid.SelectedItems);
obj.Closing += (s, args) => isNewWindowOpen = false;
obj.Show();
_t.Interval = new TimeSpan(Class._INTERVAL_SEC_5);// 在新窗口中添加一个定时器,每隔 5 秒钟刷新一次数据
_t.Tick += _tResultList_Tick;// 获取需要显示的数据,并更新窗口中的控件显示
bEnableThrd = true;
_t.Start();
}
}
));
}
}
}
WPF主窗口页面,当点击某一行时能选中5行并定时刷新这5行数据
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
关注【以下回答由 GPT 生成】
问题中的代码片段并没有完整的实现所需的功能。根据您的描述,我将提供一种实现该功能的方法。
在DataGrid中,可以使用SelectionChanged事件来处理行的选择。下面是实现的具体步骤:
- 首先,需要给DataGrid绑定SelectionChanged事件,可以在XAML中添加事件处理程序:
<DataGrid Name="datagrid" SelectionChanged="DataGrid_SelectionChanged" />- 在事件处理程序中,获取所选行的索引,并根据索引选中该行及其前后4行:
private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) { int selectedIndex = datagrid.SelectedIndex; // 选中当前行及前后4行 int startIndex = selectedIndex - 2; // 选中行的前两行起始索引 int endIndex = selectedIndex + 2; // 选中行的后两行结束索引 startIndex = Math.Max(startIndex, 0); // 确保起始索引不小于0 endIndex = Math.Min(endIndex, InfoLists.Count - 1); // 确保结束索引不超过集合的最后一行索引 datagrid.SelectedItems.Clear(); for (int i = startIndex; i <= endIndex; i++) { datagrid.SelectedItems.Add(InfoLists[i]); } }- 在定时器事件处理程序中,刷新选中行的数据:
private void _tFirstResultList_Tick(object sender, EventArgs e) { try { if (bEnableThrd) { // Check whether base object exist or not if (grpcService.IsHostChannelReadyAsync(DateTime.UtcNow.AddSeconds(1))) { _t.Interval = new TimeSpan(Cl._TIMESPAN_INTERVAL_SEC_5); // 获取选中行的索引,刷新选中行的数据 var selectedIndexes = datagrid.SelectedItems.Cast<YourDataType>().Select(item => InfoLists.IndexOf(item)); foreach (int index in selectedIndexes) { InfoLists[index] = RefreshData(index); } datagrid.ItemsSource = null; datagrid.ItemsSource = InfoLists; } else { _t.Stop(); _t = null; } } } catch (Exception ex) { Console.WriteLine(ex.Message); } } // 刷新数据方法示例 private YourDataType RefreshData(int index) { // TODO: 根据索引获取需要刷新的数据,并返回刷新后的数据对象 return new YourDataType(); }请注意,这只是一种实现方法,您可以根据实际情况进行调整和优化。另外,根据问题描述,代码中的grpcService.IsHostChannelReadyAsync方法可能会影响结果,您可能需要根据实际情况调整该方法的使用。
希望这个解决方案能对您有所帮助。如果您还有任何其他问题,请随时提问。
【相关推荐】
- 这个问题的回答你可以参考下: https://ask.csdn.net/questions/1079622
- 这篇博客你也可以参考下:WPF中实现两个窗口之间传递数据
- 您还可以看一下 严培华老师的1小时精通WPF无边框程序设计课程中的 WPF无边框窗口介绍小节, 巩固相关知识点
- 除此之外, 这篇博客: WPF实现动画——伸缩中的 (5)设置速度 部分也许能够解决你的问题。
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^解决 无用评论 打赏 举报