关于combobox递归显示树后取值问题

 
上一次我写的那篇<<关于combobox如何递归显示树效果>>
一文中,因为递归用了combobox.Items.Add(object item);
 
这个只能传达object,如果想传Text和Value两个值,可以写一个结构体,把这个结构体变量加到Items中.这样在结构体中可以有Text值,也有Value值.具体参考
但这种方法感觉不是很好理解,所以选择在DataTable入手.
首先要知道.在ComBoBox中加入项目的方法
 
一.   直接手动加项目
二.   可以用combobox.Items.Add(object item)加项目
三.   可以用DataTable创建临时数据表再绑定
第一种方法就不多说了,第二种方法如果要传Text和Value两个值,要另外写结构体,比较麻烦, 而第三种则不需要,它能同时获得Text 和Value值
例子(Sample code as follows):
DataTable dtTest = new DataTable( "Test" );
dtTest.Columns.Add( "ID", typeof( string ) );
dtTest.Columns.Add( "Status", typeof( bool ) );
dtTest.Rows.Add( new object[]{ 1, false } );
dtTest.Rows.Add( new object[]{ 2, true } );
dtTest.AcceptChanges();
 
comboBox1.DataSource = dtTest;
comboBox1.ValueMember = "ID";
comboBox1.DisplayMember = "Status";
 
上次的是直接用combobox.Items.Add(object item);递归在添加项目到combobox;
为了能获得Text 和Value 值,可以先递归生成临时表dtTest,然后在用
comboBox1.DataSource = dtTest;
comboBox1.ValueMember = "ID";
comboBox1.DisplayMember = "Status";
 
绑定,这样的好处是同时可以获得两个值,而不需要写结构体.
 
下面是修改后的代码,细心的人会发现,基本同上个例子 http://blog.youkuaiyun.com/lzt7/archive/2006/12/14/1442898.aspx 代码一样,只是小小改动:
 
        public DataView drv(string query)
        {
            OleDbConnection conn = new OleDbConnection();
            conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D: //xcrs.mdb";
            conn.Open();
            OleDbDataAdapter adp = new OleDbDataAdapter(query, conn);
            DataSet ds = new DataSet();
            adp.Fill(ds, "bm");
            return ds.Tables["bm"].DefaultView;
            conn.Close();
            conn.Dispose();
        }
        ///<summary>
        ///递归显示-其他控件treeview效果模仿
        ///调用方法:
        /// dv = drv("select * from bm");
        /// dv.Sort = "PID ASC";
        /// CreateTree(treeview控件ID,Dataview)
        ///</summary>
        ///<param name="trvDBBinding">需要绑定的treeview控件名称</param>
        ///<returns>结果</returns>
        public void CreateComboboxTree( ComboBox trvDBBinding, DataView dv)
        {
            DataRowView[] arrDRV = dv.FindRows(0);//Get root data info
            int tnNew;
            if (arrDRV.Length == 0) return;
         //新加上去的临时表
            DataTable dt = new DataTable("Test");
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("Name", typeof(string));
            foreach (DataRowView dr in arrDRV)
            {
                dt.Rows.Add(new object[] { Convert.ToInt32(dr["ID"]), dr["Name"].ToString() });  
                tnNew = Convert.ToInt32(dr["ID"]);
                CreateComboboxTreeNode(dt, ref tnNew, dv, " ");
 
            }
            trvDBBinding.DataSource = dt;
            trvDBBinding.ValueMember = "ID";
            trvDBBinding.DisplayMember = "Name";
        }
        ///<summary>
        ///递归显示-其他控件treeview效果模仿
        ///树连接数据库------子节点
        ///</summary>
        ///<param name="tnParent">父ID</param>
        ///<returns>结果</returns>
        public void CreateComboboxTreeNode(DataTable dt, ref int tnParent, DataView dv, string strfill)
        {
            DataRowView[] arrDRV = dv.FindRows(tnParent);//Get children data info
            int tnNew;
            foreach (DataRowView dr in arrDRV)
            {
                dt.Rows.Add(new object[] { Convert.ToInt32(dr["ID"]), strfill + dr["Name"].ToString() });
                tnNew = Convert.ToInt32(dr["ID"]);
                CreateComboboxTreeNode(dt, ref tnNew, dv, strfill + " ");
            }
        }
 
 
调用方法:
在form_load 事件中写:
 DataView dv = drv("select * from bm");
 dv.Sort = "PID ASC"; //pai xu
 CreateComboboxTree(this.comboBox1, dv);
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值