转载:http://blog.sina.com.cn/s/blog_629e606f01014d4b.html

ComboBox最经常使用的事件就是SelectedIndexChanged。但在将ComboBox绑定到某个数据源的过程中,会触发SelectedIndexChanged
事件,而这个时候用户并没有选择内容,其SelectedValue也不是对应字段的值。那么时写在SelectedIndexChanged中的处理代码就会因为SelectedValue的内容不正确引发异常。
一般网上找到的方法是添加一个标记位,在绑定前设置为false,绑定完成后设置回true。

void BindComboBox()
{
    flag=false;
    ComboxBox1.ValueMember="ValueColumn";
    ComboxBox1.DisplayMember="DisplayColumn";
    ComboxBox1.DataSource=DataTable1;
    flag=true;
}
 
 
private void ComboxBox1_SelectedIndexChanged(object sender, EventArgs e)
{
     if(flag)
     {
          //Do something
      }   
}

另外还有一种办法,就是在绑定前,将SelectedIndexChanged的委托去掉,等绑定完成后,再添加事件委托。

 
void BindComboBox()
{          //去除委托
            ComboBox1.SelectedIndexChanged -= new EventHandler(ComboBox1_SelectedIndexChanged);           
            ComboBox1.DataSource = null;
            ComboBox1.ValueMember = "ValueColumn";          
            ComboBox1.DataSource = DataTable1;
            //添加委托 
            ComboBox1.SelectedIndexChanged += new EventHandler(ComboBox1_SelectedIndexChanged);
            ComboBox1.DisplayMember = "DisplayColumn";
}

两种方法都可以,但是之间的优劣暂时没去比较。感觉好像处理一下委托会好点。因为这种办法真的减少了事件的激发次数。
不知道还有没有其他解决方案呢?

另,贴上一段完整的代码例子。这个例子是访问SqlServer数据库的AdventureWorks,通过ProductCategory和ProductSubCategory两级目录分类去查看Product表的内容。分别使用两个ComboBox和DataGridView完成数据绑定。效果就是选择之后会联动改变相关内容。

 
public partial class frmProduct : Form
    {
DataSet DS = new DataSet();
        String ConnectionString = "integrated security=true; database=AdventureWorks; server=localhost; ";
        public frmProduct()
        {
            InitializeComponent();
        }
       
        private void frmProduct_Load(object sender, EventArgs e)
        {
            SqlDataAdapter da = new SqlDataAdapter("select ProductCategoryID,[Name] from Production.ProductCategory", ConnectionString)
;
            cbbCategories.SelectedIndexChanged -= newEventHandler(cbbCategories_SelectedIndexChanged);
            da.Fill(DS, "ProductCategory");
            cbbCategories.DataSource = null;
            cbbCategories.ValueMember = "ProductCategoryID";          
            cbbCategories.DataSource = DS.Tables["ProductCategory"];
            cbbCategories.SelectedIndexChanged += newEventHandler(cbbCategories_SelectedIndexChanged);
            cbbCategories.DisplayMember = "Name";//这句放在事件委托之后才会有联动效果,下同
        }

private void cbbCategories_SelectedIndexChanged(object sender, EventArgs e)
        {
            SqlDataAdapter da = new SqlDataAdapter("select ProductSubCategoryID,[Name] from Production.ProductSubCategory where  ProductCategoryID=" + cbbCategories.SelectedValue.ToString(), ConnectionString)
;
            if (DS.Tables["ProductSubCategory"] != null)
            {
                DS.Tables["ProductSubCategory"].Clear();
            }
            da.Fill(DS, "ProductSubCategory");
            cbbSubCategories.SelectedIndexChanged -= newEventHandler(cbbSubCategories_SelectedIndexChanged);
            cbbSubCategories.DataSource = null;           
            cbbSubCategories.ValueMember = "ProductSubCategoryID";
            cbbSubCategories.DataSource = DS.Tables["ProductSubCategory"];
            cbbSubCategories.SelectedIndexChanged += newEventHandler(cbbSubCategories_SelectedIndexChanged);
            cbbSubCategories.DisplayMember = "Name";
        }

private void cbbSubCategories_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbbSubCategories.SelectedIndex == -1)
                return;
            SqlDataAdapter da=new SqlDataAdapter("select * from Production.Product where ProductSubCategoryID=" + cbbSubCategories.SelectedValue.ToString(), ConnectionString);
            dgvProduct.DataSource = null;
            if (DS.Tables["Product"] != null)
                DS.Tables["Product"].Clear();
            da.Fill(DS, "Product");
            dgvProduct.DataSource = DS.Tables["Product"];
        }
    }

ComboBox绑定数据源时触发SelectedIndexChanged事件的处理办法的更多相关文章

  1. ext中处理Combobox组件点击触发后台事件的问题

    ext的Combobox组件在绑定数据的时候需要一个Store来绑定数据,在store里面我们可以设置autoLoad属性,这个属性表示Store可以自动的到后台获取数据,ext实质上就是封装好的ja ...

  2. DropDownList 控件不能触发SelectedIndexChanged 事件

    相信DropDownList 控件不能触发SelectedIndexChanged 事件已经不是什么新鲜事情了,原因也无外乎以下几种: 1.DropDownList 控件的属性 AutoPostBac ...

  3. 整理:WPF用于绑定命令和触发路由事件的自定义控件写法

    原文:整理:WPF用于绑定命令和触发路由事件的自定义控件写法 目的:自定义一个控件,当点击按钮是触发到ViewModel(业务逻辑部分)和Xaml路由事件(页面逻辑部分) 自定义控件增加IComman ...

  4. focusout([data],fn) 当元素失去焦点时触发 focusout 事件。

    focusout([data],fn) 概述 当元素失去焦点时触发 focusout 事件. focusout事件跟blur事件区别在于,他可以在父元素上检测子元素失去焦点的情况.大理石平台怎么样 参 ...

  5. blur([[data],fn]) 当元素失去焦点时触发 blur 事件。

    blur([[data],fn]) 概述 当元素失去焦点时触发 blur 事件.大理石平台生产厂 这个函数会调用执行绑定到blur事件的所有函数,包括浏览器的默认行为.可以通过返回false来防止触发 ...

  6. GridView点击行触发SelectedIndexChanged事件

    1.在<% @Page ...... %>指令中添加 EnableEventValidation="false" 2.在RowDataBound事件中添加 protec ...

  7. [C# 基础知识系列]专题五:当点击按钮时触发Click事件背后发生的事情 (转载)

    当我们在点击窗口中的Button控件VS会帮我们自动生成一些代码,我们只需要在Click方法中写一些自己的代码就可以实现触发Click事件后我们Click方法中代码就会执行,然而我一直有一个疑问的—— ...

  8. input中的内容改变时触发的事件

    input中的内容改变时触发的事件 1. onchange事件与onpropertychange事件的区别: onchange事件在内容改变(两次内容有可能相等)且失去焦点时触发:onproperty ...

  9. jQuery和javaScript页面加载完成时触发的事件

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

随机推荐

  1. angularjs中关于ng-if的一些理论

    ng-if简介: ● 使用ng-if指令可以完全根据表达式的值在DOM中生成或移除一个元素.如果赋值给ng-if 的表达式的值是false,那对应的元素将会从DOM中移除,否则对应元素的一个克隆将被重 ...

  2. javascript学习教程之---如何从一个tab切换到banner幻灯片的转换2

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  3. php测试题整理(0519)

    1.B/S架构和C/S架构: B/S架构是依托于浏览器的网络系统,C/S架构是基于客户端的. B/S架构: 随着Internet和WWW的流行,以往的主机/终端和C/S都无法满足当前的全球网络开放.互 ...

  4. 一个Hadoop难以查找的错误

    This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh Starting namenodes on [Master1 ...

  5. Java添加自定义注解

    今天在整合MyBatis过程中,我使用扫描的方式去扫描DAO目录下的Java文件,但是在Service层使用Autowired的时候报错,但是工程能正常运行,此处有Bug! 解决方案: 1.创建 an ...

  6. 转:从BeagleBone谈AM335x硬件系统设计

    链接:http://blog.chinaunix.net/uid-730738-id-3266690.html    作者:chenzhufly 从BeagleBone谈AM335x硬件系统设计 日期 ...

  7. 51单片机引脚ALE/PROG/PSEN/EA/Vpp

    51单片机的4个控制引脚,其中一个引脚是复位引脚(RST/Vpd),RST是复位引脚,当RST输入端保持2个机器周期以上高电平时,就实现复位. ALE/PROG是地址锁存允许信号输出端,在读写外部存储 ...

  8. OpenUrl 的跨平台实现

    OpenUrl 是 iOS 中 UIApplication 提供的一个函数,用于调用其它程序.实际上各个平台都有自己的实现,这里提供一个直接封装完的跨平台版本给大家.           Delphi ...

  9. 程序错误[C/C++]

    对于初学者而言,一般意义上,程序错误可以分为两类,逻辑错误和非逻辑错误.前者是指,程序可以通过编译或链接但运行时不符合预期结果,后者是程序不能通过编译或链接. 乍一看这样的分类非常清楚.不过,当引入语 ...

  10. 同行blog收集

    姜楠:http://www.slyar.com/blog/ 赵劼:http://blog.zhaojie.me/ 研究者July:http://my.csdn.net/v_JULY_v 王卓群:htt ...