Wmiao_0715 2023-11-30 17:26 采纳率: 50%
浏览 4

WPF主窗口页面,当点击某一行时能选中5行并定时刷新这5行数据


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();
                }
            }
            ));
        }
    }
}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-01 05:28
    关注

    【以下回答由 GPT 生成】

    问题中的代码片段并没有完整的实现所需的功能。根据您的描述,我将提供一种实现该功能的方法。

    在DataGrid中,可以使用SelectionChanged事件来处理行的选择。下面是实现的具体步骤:

    1. 首先,需要给DataGrid绑定SelectionChanged事件,可以在XAML中添加事件处理程序:
    <DataGrid Name="datagrid" SelectionChanged="DataGrid_SelectionChanged" />
    
    1. 在事件处理程序中,获取所选行的索引,并根据索引选中该行及其前后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]);
        }
    }
    
    1. 在定时器事件处理程序中,刷新选中行的数据:
    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方法可能会影响结果,您可能需要根据实际情况调整该方法的使用。

    希望这个解决方案能对您有所帮助。如果您还有任何其他问题,请随时提问。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 11月30日