对于控件中显示的数据可能是不固定的。如果固定,数据发生了变化,又要重新设计,这样浪费成本,资源。
所以有用代码操作控件,自由度,可控度高。
1,树控件
//把 tv 作为全局变量 , 这是对动态控件取值的一种方式TreeView tv = new TreeView();private void Form1_Load(object sender, EventArgs e){//把tv加入窗体Controls.Add(tv);//填满tv.Dock = DockStyle.Fill;DataTable dt = DBHelper.ExecuteTable("select * from grade");//遍历年级foreach (DataRow row in dt.Rows){//一行 一个节点TreeNode node = new TreeNode();//树节点 是 年级名node.Text = row["GradeName"].ToString();tv.Nodes.Add(node);//得到年级对应的这个班级DataTable classs = DBHelper.ExecuteTable(string.Format("select * from class where gradeid = '{0}'",row["gradeid"]));//把班级名 加到这个年级下foreach (DataRow item in classs.Rows){node.Nodes.Add(item["ClassName"].ToString());}}//双击table 生成点击 事件tv.AfterSelect += Tv_AfterSelect;}private void Tv_AfterSelect(object sender, TreeViewEventArgs e){//测试 MessageBox.Show(tv.SelectedNode.Text);//动态控件好处之一 值随数据库的改变 自身 样式 也随之改变}
2 tabcontrol & listview
private void Form2_Load(object sender, EventArgs e){ArrayList arr = new ArrayList();//tabcontrol + listview 动态控件TabControl tc = new TabControl();tc.Dock = DockStyle.Fill;this.Controls.Add(tc);DataTable grade = DBHelper.ExecuteTable("select * from Grade");foreach (DataRow row in grade.Rows){//一个选项卡页 对应 一个 年级名TabPage tp = new TabPage(row["gradeName"].ToString());//把年级 添加到 选项卡 中的 选项页tc.TabPages.Add(tp);// 实例化一个 listview ListView lv = new ListView();//并 加入到 每个 选项卡页tp.Controls.Add(lv);//双击事件 lv.DoubleClick += Lv_DoubleClick;lv.Dock = DockStyle.Fill;//得到班级信息DataTable classs = DBHelper.ExecuteTable(string.Format("select * from class where gradeid = '{0}'", row["gradeid"]));foreach (DataRow item in classs.Rows){//遍历 班级表 并把班级 加入到 每个listview 中ListViewItem lvi = new ListViewItem(item["ClassName"].ToString());lv.Items.Add(lvi);}}}private void Lv_DoubleClick(object sender, EventArgs e){//这是得到 listview 中的 选中值 , 英文好一点 就 看懂了 但这种方式最死,而且 蠢 易出错//string value = ( ((Controls[0] as TabControl).SelectedTab as TabPage).Controls[0] as ListView ).SelectedItems[0].Text;//MessageBox.Show(value);//第三种方式 , 面向对象思想的 运用 //如果 list view 触发了 这个双击事件 就得到 选中的值string value = (sender as ListView).SelectedItems[0].Text;MessageBox.Show(value);}