1、前四列是固定的,包括表中的主键,更新数据的时候得用到,绑定的方法在DataGrid的动态绑定问题(一) 也有写过。
1
#region
绑定前四列固定列,且隐藏前两列(yf,zgdm,xm,zt)
2 for ( int i = 0 ;i < 5 ;i ++ )
3 {
4 BoundColumn bc = new BoundColumn();
5 bc.DataField = ds.Tables[ 0 ].Columns[i].ColumnName;
6 bc.Visible = false ;
7 if (i == 2 )
8 {
9 bc.HeaderText = " 姓名 " ;
10 bc.HeaderStyle.Width = 40 ;
11 bc.Visible = true ;
12 }
13 else if ( i == 4 )
14 {
15 bc.HeaderText = " 状态 " ;
16 bc.HeaderStyle.Width = 40 ;
17 bc.Visible = true ;
18 }
19 DataGrid1.Columns.Add(bc);
20 txtColumnName.Text += ds.Tables[ 0 ].Columns[i].ColumnName;
21 txtColumnName.Text += " , " ;
22 }
23 #endregion
2 for ( int i = 0 ;i < 5 ;i ++ )
3 {
4 BoundColumn bc = new BoundColumn();
5 bc.DataField = ds.Tables[ 0 ].Columns[i].ColumnName;
6 bc.Visible = false ;
7 if (i == 2 )
8 {
9 bc.HeaderText = " 姓名 " ;
10 bc.HeaderStyle.Width = 40 ;
11 bc.Visible = true ;
12 }
13 else if ( i == 4 )
14 {
15 bc.HeaderText = " 状态 " ;
16 bc.HeaderStyle.Width = 40 ;
17 bc.Visible = true ;
18 }
19 DataGrid1.Columns.Add(bc);
20 txtColumnName.Text += ds.Tables[ 0 ].Columns[i].ColumnName;
21 txtColumnName.Text += " , " ;
22 }
23 #endregion
2、其它的列是需要用户进行录入数据的,并且如果有数据也是需要显示的。所以初步想的是需要绑定TextBox上去,而且是ItemTemplate绑定,所以这就需要自定义模板列了。
MyColumn myCol
=
new
MyColumn();
myCol.HeaderText = dr.ItemArray[ 1 ].ToString();
myCol.HeaderStyle.Width = 40 ;
myCol.DataTextField = ds.Tables[ 0 ].Columns[j].ColumnName;
myCol.ItemStyle.Width = 40 ;
DataGrid1.Columns.Add(myCol);
myCol.HeaderText = dr.ItemArray[ 1 ].ToString();
myCol.HeaderStyle.Width = 40 ;
myCol.DataTextField = ds.Tables[ 0 ].Columns[j].ColumnName;
myCol.ItemStyle.Width = 40 ;
DataGrid1.Columns.Add(myCol);
3、自定义模板列的类,引用页记得要注册一下就可以了。
public
class
MyColumn :DataGridColumn
{
public string DataTextField;
public string DataValueField;
public DataTable DataSource;
public override void InitializeCell(TableCell cell, int columnIndex, ListItemType itemType)
{
base .InitializeCell (cell, columnIndex, itemType);
switch (itemType)
{
case ListItemType.Header :
cell.Text = this .HeaderText;
cell.Width = this .HeaderStyle.Width ;
break ;
case ListItemType.Item: case ListItemType.AlternatingItem :
cell.DataBinding += new EventHandler(cell_DataBinding);
cell.Width = this .ItemStyle.Width ;
TextBox tb = new TextBox ();
tb.Width = 40 ;
cell.Controls.Add(tb);
break ;
}
}
private void cell_DataBinding( object sender, EventArgs e)
{
TableCell cell = (TableCell)sender;
TextBox tb = (TextBox)cell.Controls[ 0 ];
DataGridItem dgi = (DataGridItem)cell.NamingContainer;
tb.Text = (DataBinder.Eval(dgi.DataItem, this .DataTextField)).ToString();
}
}
4、数据录入:利用javascript函数在界面上实现的。还能进行一下批改。
{
public string DataTextField;
public string DataValueField;
public DataTable DataSource;
public override void InitializeCell(TableCell cell, int columnIndex, ListItemType itemType)
{
base .InitializeCell (cell, columnIndex, itemType);
switch (itemType)
{
case ListItemType.Header :
cell.Text = this .HeaderText;
cell.Width = this .HeaderStyle.Width ;
break ;
case ListItemType.Item: case ListItemType.AlternatingItem :
cell.DataBinding += new EventHandler(cell_DataBinding);
cell.Width = this .ItemStyle.Width ;
TextBox tb = new TextBox ();
tb.Width = 40 ;
cell.Controls.Add(tb);
break ;
}
}
private void cell_DataBinding( object sender, EventArgs e)
{
TableCell cell = (TableCell)sender;
TextBox tb = (TextBox)cell.Controls[ 0 ];
DataGridItem dgi = (DataGridItem)cell.NamingContainer;
tb.Text = (DataBinder.Eval(dgi.DataItem, this .DataTextField)).ToString();
}
}
5、遇到的问题
Q:点击页面上的按钮,整个datagrid就不见了?奇怪,就算要刷新数据也应该让我先读一下啊,结果DataGrid1.Items.Count=0。
A:原来用这种方法进行datagrid 的绑定,是不能写在if(!Page.IsPostBack){}这里的
Q:关于隐藏列的问题,用visible=false的方法,在前台javascript的方法中是读不到该列的。
A:为该列绑定属性display:none
6、保存数据,利用事务提交界面数据到数据库中。不过还有一个问题,如果两个人同时做相同的操作呢,另一个人没有根据前一个人的修改,修改界面数据,那么再次操作,前一个人的修改就无效了!这个问题怎么解决?还有待研究了!