首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在加载DataGridView时阻止SelectionChanged

在 Windows Forms 应用程序中,DataGridViewSelectionChanged 事件在加载数据时可能会被多次触发,这可能导致不必要的性能开销或逻辑错误。为了在加载数据时阻止 SelectionChanged 事件的触发,可以采用以下几种方法:

方法一:使用布尔标志位

这是最常见也是最简单的方法。通过引入一个布尔变量来指示数据是否正在加载,在加载过程中忽略 SelectionChanged 事件。

代码语言:javascript
复制
private bool isLoading = false;

// 加载数据的方法
private void LoadData()
{
    isLoading = true;

    // 假设你有一个 DataTable 来填充 DataGridView
    DataTable dt = GetData(); // 获取数据的逻辑
    dataGridView1.DataSource = dt;

    isLoading = false;
}

// SelectionChanged 事件处理程序
private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
    if (isLoading)
        return;

    // 处理选择变化的逻辑
    // 例如,获取选中的行
    var selectedRows = dataGridView1.SelectedRows;
    foreach (DataGridViewRow row in selectedRows)
    {
        // 处理每一行
    }
}

方法二:移除和重新添加事件处理程序

在加载数据之前移除 SelectionChanged 事件处理程序,加载完成后再重新添加。这种方法避免了使用额外的标志位。

代码语言:javascript
复制
// 加载数据的方法
private void LoadData()
{
    dataGridView1.SelectionChanged -= dataGridView1_SelectionChanged;

    // 填充 DataGridView 的逻辑
    DataTable dt = GetData();
    dataGridView1.DataSource = dt;

    dataGridView1.SelectionChanged += dataGridView1_SelectionChanged;
}

// SelectionChanged 事件处理程序
private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
    // 处理选择变化的逻辑
}

方法三:使用 DataSource 属性的 DataBinding 完成事件

如果你需要在数据绑定完成后执行某些操作,可以利用 DataBinding 完成事件来确保数据加载完成后再处理选择变化。

代码语言:javascript
复制
private void LoadData()
{
    DataTable dt = GetData();
    dataGridView1.DataSource = dt;
}

private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    // 数据绑定完成后,可以安全地处理选择变化
}

确保在初始化时订阅 DataBindingComplete 事件:

代码语言:javascript
复制
public YourFormConstructor()
{
    InitializeComponent();
    dataGridView1.DataBindingComplete += dataGridView1_DataBindingComplete;
}

注意事项

  1. 线程安全:如果数据加载是在非UI线程中进行的,确保在更新UI组件(如 DataGridView)时使用 InvokeBeginInvoke 方法,以避免跨线程操作异常。
  2. 性能优化:在处理大量数据时,频繁触发 SelectionChanged 事件可能导致性能问题。即使不加载数据,也建议在事件处理程序中进行必要的性能优化,例如只处理选中的行而不是全部行。
  3. 用户体验:在某些情况下,用户可能希望在数据加载完成后自动选择某一行或执行其他操作。可以根据需求在数据加载完成后手动设置选择状态。

通过以上方法,可以有效地在加载 DataGridView 数据时阻止 SelectionChanged 事件的触发,从而提升应用程序的性能和稳定性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C# WPF DataGrid获取单元格并改变背景色

01 概述 WPF 自带了一个表格控件datagrid,这个控件类似winfrom中的datagridview,在数据显示的时候也经常会用到,这节主要讲解如何从后台代码获取到单元格控件并改变其相关属性:...]=[GridControl_SelectionChanged($source,$eventArgs)];" SelectedCellsChanged...="DG_SelectedCellsChanged" CellEditEnding="dgSourceData_BeginningEdit" SelectionChanged="dgSourceData_SelectionChanged...Text; ③获取选中的列号: colindex = this.dgSourceData.CurrentCell.Column.DisplayIndex;//获取选中单元格列号 ④获取选中行的行号 在SelectionUnit...FullRow" 时候: 可以通过这样获取: rowindex = this.dgSourceData.SelectedIndex;//获取选中单元格行号 在当SelectionUnit="Cell"时:

2.8K20
  • 在JTAG下载器连接时FPGA不加载flash里的程序

    :当板断电或断开电缆连接时,Vivado将在硬件管理器中关闭硬件目标。 重新打开板电源或重新连接电缆后,Vivado现在将自动尝试在Hardware Manager中重新打开硬件目标。...电路板上电或正在上电 (上面描述的就是我们说的;在JTAG下载器连接时FPGA不加载flash里的程序,基本就一样不差) 如果使用了任何配置接口(JTAG除外),并且还连接了JTAG电缆,则JTAG...在以下三种情况下可能会发生此问题(上面情况时必发生的): 设备上电或重启。脉冲PROGRAM_B不会导致此问题,因为Vivado硬件管理器看不到电缆断开连接并执行了电缆自动检测。...有关更多信息,请参见《(UG894)Vivado Design Suite用户指南中的使用Tcl脚本》中的“加载和运行Tcl脚本”一章。...get_property HW_JTAG $tmp_target close_hw_target $tmp_target open_hw_target $tmp_target 我试过第一种方式,同时用两种方式加载了

    1.7K21

    在处理大型复杂的 YAML 配置文件时,如何提高其加载和解析效率?

    在处理大型复杂的 YAML 配置文件时,可以考虑以下几种方法来提高加载和解析效率: 使用流式解析器:流式解析器逐行读取文件并逐步解析,而不是一次性加载整个文件。...使用多线程加载:将文件分成多个部分,使用多线程同时加载和解析这些部分。这样可以利用多核 CPU 提高加载和解析速度。...使用缓存:将已经解析过的配置文件保存在缓存中,下次加载时可以直接使用缓存中的数据,而不需要重新解析。 压缩文件:对配置文件进行压缩,可以减小文件大小,从而提高加载和解析速度。...这样可以减小文件大小,并且加快加载和解析速度。 使用更高效的 YAML 解析库:不同的编程语言有不同的 YAML 解析库,可以对比它们的性能,并选择最适合的解析库来提高效率。...综上所述,通过使用流式解析器、多线程加载、缓存、压缩文件、简化配置文件结构和更高效的解析库,可以显著提高大型复杂 YAML 配置文件的加载和解析效率。

    13100

    C#实现WinForm DataGridView控件支持叠加数据绑定

    说白了就是支持数据的多次绑定,标准的绑定方法只支持单一绑定,即每次绑定均会清除原来的数据,而叠加数据绑定则可实现每次绑定均以附加的形式(原数据保留)添加到DataGridView控件中,这样就实现了分页加载...,但可完整显示已加载的所有数据,这种应用场景在C/S端很常见,B/S端上也有(例如QQ空间动态下面的加载更多按钮) 以下是实现附加数据两种方式: 第一种方式,采用反射获取属性值并循环添加数据行...watch.Stop(); //MessageBox.Show(watch.ElapsedMilliseconds.ToString()); } 以上两种方法在代码量来看...,第二种比较简单,第一种在执行效率上相对第二种方法要高,原因很简单,第一种每次处理的数据永远都是每页的数据,而第二种每次处理的数据是原有数据与现有数据的合集,随着数据量越多,加载也就越慢,大家也可以试一下...造成影响,我定义了一个接口来规范它:IAppendDataAble,当然这个接口适用于所有控件,然后在扩展方法时AppendData加判断,如果实现了IAppendDataAble

    1.9K30

    可视化数据库设计软件有哪些_数据库可视化编程

    7)通过对这些在 Visual Studio .NET 项目中创建的数据组件编程来与数据资源进行交互。...数据连接”上右击弹出快捷菜单,选择“添加连接”命令); 第三,类型化数据集的创建(新建一个“Windows应用程序”,然后在创建的项目上右击,在弹出的快捷菜单上选择“添加”→“新建项”命令,“模板”选择...5.DataGridView列的编辑 单击DataGridView控件的设计器中“编辑列”选项,或者在DataGridView控件的“属性”面板中单击Columns属性右侧的省略按钮,即可进入“编辑列...控件绑定到BindingSource控件,为BindingNavigator控件添加“加载”“保存”和“取消”按钮,实现加载、保存记录和取消操作的功能。...“加载”“保存”和“取消”按钮添加事件代码分别如下:(窗体运行结果如图5-22所示)*/ private void tsLoad_Click(object sender, EventArgs e) {

    6.7K40

    xBIM 实战04 在WinForm窗体中实现IFC模型的加载与浏览

    如果确实需要在传统的 WinForm 窗体中也要加载并显示BIM(.ifc格式)模型文件该如何处理呢?   ...由于WinForm与WPF技术可以互通互用,所以本文介绍一种取巧的方式,在WinForm窗体中加载WPF控件,WPF控件中渲染BIM(.ifc格式)模型文件。具体操作步骤如下详细介绍。...四、在Winform项目中添加WPF用户控件 ?...五、在WinForm窗体中调用WPF查看器   添加一个WinForm窗体。左侧Panel中是 按钮区域,右侧Panel填充窗体剩余的所有区域。 ? 打开VS的工具箱,可以看到如下栏目 ?...后台逻辑:在第四步骤中创建了一个WPF用户控件,在此处实例化一个对象 private WinformsAccessibleControl _wpfControl; 在构造函数中初始化该对象并将对象添加到

    1.4K30

    ado.net的简单数据库操作(三)——简单增删改查的实际应用

    实例描述:在数据库新建一张TbClass表,将表的内容读取到一个DataGridView上,并且可以在winform面板上对表里的内容进行增、删、改的操作。首先给出winform的设计: ?...然后确定查询语句,为:select * from TbClass; 2.添加SqlHelper,编写数据加载方法 首先,创建LoadData()方法,然后在Form1_Load()方法中调用LoadData...上 22 this.dataGridView1.DataSource = list; 23 }   在使用SqlHelper之前,需要在App.config中添加配置代码和在项目中添加引用...,这是需要注意的,因为在以前的博客中有详细讲解如何添加,这里不再讲了哈。...然后,要在鼠标选中某一行时,获取该行的tClassId.接下来看看获取该id的做法: 在dataGridView的属性页中找到一个名为RowEnter的事件,双击进入方法,编写函数: ? ?

    1.4K30

    在DataGridView控件中加入ComboBox下拉列表框的实现

    本文转载:http://www.cnblogs.com/luqingfei/archive/2007/03/28/691372.html 虽然在Visual Studio中 DataGridView...首先新建一个Windows应用程序,将主窗体重命名为MainForm,在MainForm中加入一个DataGridView控件,命名为dgv_User。如下图所示: ?   ..."赵六";     drData[] = "";     dtData.Rows.Add(drData);     this.dgv_User.DataSource = dtData; }   为窗体加载事件添加如下方法...或者改变DataGridView列宽时将下拉列表框设为不可见 private void dgv_User_Scroll(object sender, ScrollEventArgs e) {     this.cmb_Temp.Visible...this.cmb_Temp.Visible = false;         }         // 改变DataGridView列宽时将下拉列表框设为不可见         private void

    3.9K20
    领券