DataGrid的动态绑定问题(二)
2006-09-26 11:13
260 查看
最近需要写一个动态绑定的datagrid,数据库存着所有字段的合集,每个用户能显示的字段也是存在数据库中的。我的解决方法是取得所有的字段,再与标志表中字段的状态进行比对。
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、其它的列是需要用户进行录入数据的,并且如果有数据也是需要显示的。所以初步想的是需要绑定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);
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函数在界面上实现的。还能进行一下批改。
5、遇到的问题
Q:点击页面上的按钮,整个datagrid就不见了?奇怪,就算要刷新数据也应该让我先读一下啊,结果DataGrid1.Items.Count=0。
A:原来用这种方法进行datagrid 的绑定,是不能写在if(!Page.IsPostBack){}这里的
Q:关于隐藏列的问题,用visible=false的方法,在前台javascript的方法中是读不到该列的。
A:为该列绑定属性display:none
6、保存数据,利用事务提交界面数据到数据库中。不过还有一个问题,如果两个人同时做相同的操作呢,另一个人没有根据前一个人的修改,修改界面数据,那么再次操作,前一个人的修改就无效了!这个问题怎么解决?还有待研究了!
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、其它的列是需要用户进行录入数据的,并且如果有数据也是需要显示的。所以初步想的是需要绑定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);
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函数在界面上实现的。还能进行一下批改。
5、遇到的问题
Q:点击页面上的按钮,整个datagrid就不见了?奇怪,就算要刷新数据也应该让我先读一下啊,结果DataGrid1.Items.Count=0。
A:原来用这种方法进行datagrid 的绑定,是不能写在if(!Page.IsPostBack){}这里的
Q:关于隐藏列的问题,用visible=false的方法,在前台javascript的方法中是读不到该列的。
A:为该列绑定属性display:none
6、保存数据,利用事务提交界面数据到数据库中。不过还有一个问题,如果两个人同时做相同的操作呢,另一个人没有根据前一个人的修改,修改界面数据,那么再次操作,前一个人的修改就无效了!这个问题怎么解决?还有待研究了!
相关文章推荐
- DataGrid的动态绑定问题(一)
- EasyUI中iframe嵌入页面,包含datagrid数据动态绑定,页面内容的高度自适应问题
- DataGrid的动态绑定问题(二) 续
- [讨论]当我采用动态sql绑定datagrid分页的时候,遇到的问题
- (转)扩展jquery easyui datagrid 之动态绑定列和数据
- Silverlight 4 DataGrid动态生成列及绑定数据
- WPF Datagrid Header数据绑定,表头复选框实现全选、全否、部分选中,根据条目动态变化
- winfrom动态生成的combox控件 绑定数据源之后 无法设置默认值问题
- struts2.5动态方法绑定问题
- 动态生成的html绑定click事件没有效果不执行 click事件重复绑定问题
- silverlight3 datagrid c#中动态生成模板列(日期格式)使用IValueConvert对绑定数据的格式化操作
- 通过 IDictionary对Silverlight DataGrid 进行动态数据绑定
- DataGrid中DropDownList的动态绑定和触发DropDownList事件(*转)
- jquery easyui datagrid字段绑定问题
- HTML中动态生成内容的事件绑定问题【转载】
- 每日学习总结:DataTable按某一列数值大小排序问题、GridView后台动态绑定、页面导航方法总结
- datagrid 绑定动态列
- DataGridComboBoxColumn绑定后显示空白的问题
- js循环动态绑定带参数函数遇到的问题及解决方案[转]
- (原创)怎么在绑定后动态改变DataGrid中的内容