Winform控件——关于数据绑定:DataGridView、ComboBox、ListView、TreeView

零、这几个控件的总结图

 

 

一、DataGridView

1、DataGridView常用属性设置

 1 //DataGridView属性设置
 2 
 3 dgvList.AllowUserToAddRows = false;//不允许用户添加
 4 dgvList.AllowUserToDeleteRows = false;//不允许用户删除
 5 dgvList.AllowUserToResizeRows = false;//不允许用户调整行高
 6 dgvList.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;//所有列平分表格
 7 
 8 dgvList.BackgroundColor = System.Drawing.SystemColors.Control;//背景色
 9 
10 dgvList.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;//列头高度
11 
12 dgvList.MultiSelect = false;//不允许多选行
13 
14 dgvList.ReadOnly = true;//表格只读
15 
16 dgvList.SelectionMode = DataGridViewSelectionMode.FullRowSelect;//整行选中
17 
18 dgvList.AutoGenerateColumns = false;//绑定数据源时,不允许自动生成列
1 //列属性
2 pid.DataPropertyName = "id";//数据绑定的列名,或属性名
3 pid.HeaderText = "序号";//列头显示的名称
4 pid.Name = "id";//列控件的名称,可以根据该名称在表格中查找列
5 pid.ReadOnly = true;//列是否只读
6 pid.Visible = false;//列是否显示
7 pid.FillWeight = 70F;//表示当该列处于填充模式时,相对于控件中处于填充模式的其他列的宽度。默认值为 100
 1 //DataGridView常订阅的事件
 2 
 3 dgvList.Click += new System.EventHandler(this.dgvList_Click);//当表格控件被点击时触发
 4 
 5 dgvList.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.dgvList_CellFormatting);//在单元格的内容需要设置格式以便于显示时发生。例子如下:
 6         private void dgvList_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
 7         {//当单元格需要设置显示格式时触发
 8             if (e.ColumnIndex > 2)
 9             {//因为上班时间和下班时间列,放在第3、4列
10                 dgvList.Columns[e.ColumnIndex].DefaultCellStyle.Format = "HH:mm";
11             }
12         }
13 
14 
15 dgvList.CellMouseDoubleClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.dgvList_CellMouseDoubleClick);//双击单元格时触发
16 
17 dgvList.SelectionChanged += new System.EventHandler(this.dgvList_SelectionChanged);//选择不同行、单元格时触发。另外每次绑定DataSource数据源的时候触发。
18 
19 dgvList.KeyDown += new System.Windows.Forms.KeyEventHandler(this.dgvList_KeyDown);//焦点在表格时,按下键盘键触发,比如选中一行按下Delete键
20         private void dgvList_KeyDown(object sender, KeyEventArgs e)
21         {
22             if (e.KeyCode == Keys.Delete)
23             {//如果按的是删除键
24                 this.btn_Remove_Click(null, null);
25             }
26         }

 

2、从DataGridView中获取行所绑定的数据

 1 private void dgvList_Click(object sender, EventArgs e)
 2 {//表格被点击后
 3     if (this.dgvList.SelectedRows.Count == 0)
 4     {//如果没有行被选中,不处理
 5         return;
 6     }
 7 
 8     //因为DataGridView绑定的数据源是实体对象集合,所以每行绑定了一个实体对象。
 9     PhoneNum obj = this.dgvList.CurrentRow.DataBoundItem as PhoneNum;
10     txtCellPhone.Text = obj.Pcellphone;
11     txtHomePhone.Text = obj.Phomephone;
12     txtName.Text = obj.Pname;
13     
14     //将pid值存储到控件的TAG值中,这样做方便后面保存时Update
15     this.dgvList.Tag = obj.Pid;
16     //cboGroup.Text = obj.Ptname;//推荐使用下面方式显示Ptname,因为更合理
17     cboGroup.SelectedValue = obj.Ptypeid;//指定SelectedValue,可以自动选中对应ComboBox项
18 }

注意:如果DataGridView绑定的数据源是实体对象集合,那么每行绑定的是一个实体对象。

  如果DataGridView绑定的是DataTable,那么每行绑定的是一个DataRowView对象。(现在大家已经很少绑定DataTable了,见下面例子:)

 

//下面代码是DataGridView绑定的DataTable时。。现在已经很少有人将DataGridView绑定DataTable(而是绑定实体对象集合)。所以下面获取绑定DataRow再转实体的方式,多此一举。

DataRow dataRow = (grid_Step.CurrentRow.DataBoundItem as DataRowView).Row;//获取当前Grid的可视行,绑定的DataRow
if (dataRow != null)
{
    Model.PhoneNum phone = _bllPhone.DataRowToModel(dataRow);//通过BLL层调用DAL层方法,将DataRow转为实体对象
    //....
}

 

3、列DataGridViewColumn的子类(详见《第五天 -- 《2014-07-21 三层架构》》第一节)

 以DataGridViewComboBoxColumn为例,在DataGridView表格绑定数据源之前,应该先绑定下拉列的数据源。具体方法也可参见下一节“ComboBox的数据绑定”

 1 //在DataGridView表格控件绑定数据源之前,先绑定下拉列表列的数据源。如此一来,用户编辑该列时,可以下拉选择可选项。
 2 var  column = this.dgvList.Columns["cname"] as DataGridViewComboBoxColumn;//注意:表格列名 = 数据库列名 = 实体类属性名。推荐这样的命名方式。必须将列显式转为子类型。
 3 if (column != null)
 4 {
 5     column.DisplayMember = "cname"; //显示值。即绑定实体对象的属性名。
 6     column.ValueMember = "cid";//实际值  有更高的优先级,如果同时指定了这两项属性,那么真正的对应字段是ValueMember.以后拿出来进行匹配的就是cid值。与之匹配的也必须是对应类型和意义的字段或者属性名称
 7     column.DataSource = cm.GetAllClassesList(false);//BLL层通过DAL层获取实体对象集合——“班级表”的查询结果集
 8     column.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;//非编辑时,不显示下拉按钮
 9 }
10 
11 this.dgvList.DataSource = pm.GetAllPersonList(false);//DataGridView绑定数据源(BLL层从DAL层获取的实体对象集合)

 

 

 

 

二、ComboBox

1、ComboBox的数据绑定

1 //在绑定前,最好指定以下属性,CName 和 CID都是实体类属性名
2 cbx_Classes.DisplayMember = "CName";  //显示在下拉列表
3 cbx_Classes.ValueMember = "CID";          //便于选中后取值
4 
5 //数据源最好绑定实体对象集合。
6 cbx_Classes.DataSource = _bllClasses.GetAllClassesList();//请求班级的BLL层获取所有班级记录。

注意:每次绑定,都会刷新所有项,所以不像手动Add添加项那样:重新添加之前要先Clear一下。

 

1 //当cbx_Classes事先绑了数据源,而且指定了ValueMember和DisplayMember属性之后
2 //可以通过SelectedValue指定下拉列表应该选中哪一项
3 
4 cbx_Classes.SelectedValue = per.PCID;

 

2、ComboBox的选中项取值

1 //实例化实体类对象,下面为对象的属性赋值。
2 MODEL.Person newPerson = new MODEL.Person();
3 
4 //一般有两种方式取出下拉列表中的存储的ID号:
5 //1.通过SelectedValue,前提是你之前设置了ValueMenber值。 
6 //2.可以通过绑定项SelectedItem。如果数据源是实体集合(如List<>),那么SelectedItem就是实体对象(如果数据源是DataTable,那么SelectedItem就是DataRowView)。
7 newPerson.PCID = (this.cbx_Classes.SelectedItem as MODEL.Classes).Cid;
8 newPerson.PType = (int)cbx_Identity.SelectedValue;

 

3、ComboBox常订阅的事件

1 //选中索引改变的时候,触发事件
2 this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged);
3 
4 //选中值改变的时候,触发事件
5 this.comboBox1.SelectedValueChanged += new System.EventHandler(this.comboBox1_SelectedValueChanged);

 

4、ComboBox数据绑定作多条件查询时,经常需要手动添加一个“请选择” 或 “All”的选项。这个最好在UI层处理。如下:

1 //下拉列表显示所有的班级,用作多条件查询时的一个筛选条件。
2 this.cboSearchClass.DisplayMember = "cname";
3 this.cboSearchClass.ValueMember = "cid";
4 List<MODEL.Classes> lists= cm.GetAllClassesList(false);
5 lists.Insert(0,  new MODEL.Classes() { Cid = -1, Cname = "请选择" });//手动在最上边插入一个去除该条件的“无效实体对象”
6 this.cboSearchClass.DataSource = lists;//绑定数据源

效果如下:

 

 

 

 

 

 

 

三、ListView

 

 

四、TreeView

 

posted on 2017-08-19 16:18  困兽斗  阅读(3558)  评论(0)    收藏  举报

导航