DataGrid的动态绑定问题(二)

     最近需要写一个动态绑定的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、保存数据,利用事务提交界面数据到数据库中。不过还有一个问题,如果两个人同时做相同的操作呢,另一个人没有根据前一个人的修改,修改界面数据,那么再次操作,前一个人的修改就无效了!这个问题怎么解决?还有待研究了!

     
     

转载于:https://www.cnblogs.com/xiazhaoxia/archive/2006/09/26/514994.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值