VS2010 winform开发笔记---combox的SelectedIndexChanged事件及级联问题

DisplayMember绑定需要显示的数据表字段,

而ValueMember绑定需要获取选择的项的值。

然后通过

combo.SelectedValue就可以取得选中项的值了。

DisplayMember会显示在你的下拉框中,ValueMember的值和下拉框显示的值一一对应,并不在下拉框显示的。

所对应的值就是一条记录里面 有标识列ID(唯一) 有显示的列(如名称,可重复)
ValueMember 可以成为名称,也可成为ID
但是一般来说都只绑定ID 这样好处理,也很方便识别,
DisplayMember 是绑定显示的数据 如:北京
一般DisplayMember是显示给客户看的
 而ValueMember 是绑定处理程序标识 给程序员看的。

------------------------------------------------------------------------------------------

比如数据库一个字段 性别

用 0或者 1存储

combobox中DisplayMember显示为男或者女,ValueMember绑定的对应数据库的字段

当你保存时,要存到数据库0或者1,这时候直接获取选中的valuemenber时存储就可以了

---------------------------------------------------------------------------------------------------------------------------------

一般做法:

首先需要指定 combox.DataSource,
然后用表DataSource的字段名设置combox 的 ValueMember和DisplayMember ,
那么当你选择combox 的一个item时,你直接可见的是此item的 DisplayMember 对应内容,
而此 item的值是ValueMember 的对应内容。

 

关于.net winform ComboBoxDataSourceDisplayMemberValueMember属性的
设置顺序的问题。
《参考博客》

ComboBox的DataSource属性为object类型,但是需要实现IListSource接口的类型。

当把DataTable赋值给该属性后,如果此时没有指定ComboBox的DisplayMember和ValueMember属性的话,

这时获得的ComboBox的SelectValue属性将是System.Data.DataRowView的一个实例。

据此推测DataTable中实现的IListSource接口中的GetList()方法应该返回的是DataTable的

DefaultView,也就是DataView的一个实例是DataRowView的集合。而因为没有指定DisplayMember和ValueMember

属性,所以ComboBox直接把DataView中的每一个DataRowView实例填充到列表中。

这样的话就可能在ComboBox的SelectedIndexChanged事件处理中产生错误。

为了避免这个问题应该先设置DisplayMember和ValueMember属性,然后再设置DataSource属性。

避免先设置DataSource属性。

例如:

        public static void SetShopComboSpecial(ComboBox combo)

        {

            DataTable dt = CommonService.GetShopSpecial();

            if (dt == null) throw new Exception();

            combo.ValueMember = "SHOPID";

            combo.DisplayMember = "COMBO_DISPLAY";

            combo.DataSource = dt;

        }

关于winform的combobox联动问题的解决方案:

在使用DataSource添加加载值(从数据库),只要一赋值,添加ValueMember等就会触发selectedindexChanged事件,与写在formload里无关!

 private void Form1_Load(object sender, EventArgs e)
        {
            this.listBox1.Items.Add("软件部");
            this.listBox1.Items.Add("人事部");
            this.listBox1.Items.Add("财务部");
            this.listBox1.Items.Add("硬件部");
            this.listBox1.SelectedIndex = -1;  //如果设置0,1,2,3则在load加载窗体时就会弹出对话框了!-1表示为空,因为设置1表示index变了,会触发事件

            this.comboBox1.Items.Add("软件部");
            this.comboBox1.Items.Add("人事部");
            this.comboBox1.Items.Add("财务部");
            this.comboBox1.Items.Add("硬件部");
            //this.comboBox1.SelectedIndex = 0;//会触发comboBox1_SelectedIndexChanged事件

            DataTable dt1 = new DataTable("部门表");
            dt1.Columns.Add("部门项");

            DataRow dr1 = dt1.NewRow();
            dr1["部门项"] = "软件部";
            dt1.Rows.Add(dr1);

            DataRow dr2 = dt1.NewRow();
            dr2["部门项"] = "人事部";
            dt1.Rows.Add(dr2);

            comboBox2.ValueMember = "部门项";
            comboBox2.DisplayMember = "部门项";
            comboBox2.DataSource = dt1;//使用DataSource赋值,设置ValueMember后肯定会触发当前comboBox2的comboBox2_SelectedIndexChanged事件

        }

三个combobox级联的时候,在form_load事件中添加方法:从数据库加载combobox1的值,会触发此combobox的事件Shop_SelectedIndexChanged,在事件中填写设置第二个combobox的数据库加载方法即可!

时间: 2024-11-05 13:46:56

VS2010 winform开发笔记---combox的SelectedIndexChanged事件及级联问题的相关文章

Winform ComboBox 绑定数据源 触发SelectedIndexChanged事件 处理办法

最近寫Winform程式,發現Winform中的ComboBox和Web中的Dropdown相差很大,在ComboBox 绑定数据源 會触发SelectedIndexChanged事件,很困擾,查找了資料,處理方法大體分為三種 1.添加一个标记位,在绑定前设置为false,绑定完成后设置回true(個人覺得用起來的很奇怪) void BindComboBox() { flag=false; ComboxBox1.ValueMember="ValueColumn"; ComboxBox1

winform开发笔记

窗口的主要属性和方法 属性 说明 Name 窗体对象的名字,用以在代码中进行标识 BackColor 窗体的背景色 BackgroundImage 窗体的背景图像 FormBorderStyle 窗体显示的边框样式,有七个可选的值,默认值是Sizable MaximizeBox 确定窗体标题栏的右上角是否有最大化框,默认为True ShowInTaskbar 确定窗体是否出现在Windows任务栏中,默认为True StartPosition 确定窗体第一次出现时的位置 Text 窗体标题栏中显

[开发笔记]-实现winform半透明毛玻璃效果

亲测win7下可用,win8下由于系统不支持Aero效果,所以效果不是半透明的. 代码: 博客园插入不了代码了..... public partial class Form1 : Form { int en; public struct MARGINS { public int m_Left; public int m_Right; public int m_Top; public int m_Buttom; }; [DllImport("dwmapi.dll")] private s

[转]如何在数据绑定时不让combox控件触发SelectedIndexChanged事件

this.cboVendor.SelectedIndexChanged -= new System.EventHandler(this.cboVendor_SelectedIndexChanged); cboVendor.DataSource = myClass.RunQueryCmd(strSqlCmd); cboVendor.DisplayMember = "SupplierCode"; //添加事件 this.cboVendor.SelectedIndexChanged += n

[小问题笔记(二)] 可能导致DropDownList的SelectedIndexChanged事件不触发的几种情况

遇到SelectedIndexChanged事件没有触发,可以依次检查以下几种情况是否在程序中出现. 一.DropDownList的不同option设置了相同的value . 二.没有写 AutoPostBack="True" <asp:DropDownList id="BuDropDownList" runat="server" AutoPostBack="True"></asp:DropDownList&

安卓开发笔记——高仿新浪微博文字处理(实现关键字高亮,自定义表情替换并加入点击事件实现)

先让大家看下效果图,这个是我自己在闲暇时间仿写的新浪微博客户端: 今天来讲讲如何实现上图的效果,这里需要用到SpannableString这个工具类,如果你对这个类并不熟悉,可以先看下我之前写的2篇文章: <安卓开发笔记——个性化TextView(新浪微博)>:http://www.cnblogs.com/lichenwei/p/4411607.html <安卓开发笔记——丰富多彩的TextView>:http://www.cnblogs.com/lichenwei/p/46120

Android开发笔记(一百零三)地图与定位SDK

集成地图SDK 国内常用的地图SDK就是百度和高德了,二者的用法大同小异,可按照官网上的开发指南一步步来.下面是我在集成地图SDK时遇到的问题说明: 1.点击基本地图功能选项,不能打开地图,弹出"key验证出错!请在AndroidManifest.xml文件中检查key设置的"的红色字提示.查看日志提示"galaxy lib host missing meta-data,make sure you know the right way to integrate galaxy&

微信订阅号开发笔记(三)

1.接收语音识别结果 if($msgType=="voice"){ //收到语音消息 //MediaId 语音消息媒体id,可以调用多媒体文件下载接口拉取数据. //Format 语音格式,如amr,speex等 $format = $postObj->Format; $mediaId = $postObj->MediaId; //开通语音识别功能,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一个Recongnition字段. //注:由于客户端缓

Swift开发笔记

Swift开发笔记(一) 刚开始接触XCode时,整个操作逻辑与Android Studio.Visual Studio等是完全不同的,因此本文围绕IOS中控件的设置.事件的注册来简单的了解IOS开发 1.新建一个Xcode项目,项目目录大致如图: 2.在Main.storyboard添加控件 首先要显示右侧的工具栏(Utilities),之后选择显示Object Library,就可以找到常用的一些控件了,然后添加几个控件到界面中 3.将控件和ViewController进行关联 此时要将Ed