上一次我写的那篇<<关于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);