2013-10-29 31 views
1

我有以下数据网格认为是在DB如何在数据网格视图设置禁用或只读

我需要加载的数据网格的信息,使所有的文本框部分的一些数据绑定的数据列(在这个例子中只是出现,但有很多)是只读或禁用的。

<asp:DataGrid ID="grdRequestTypeItem" TabIndex="1" runat="server" CssClass="Grid" AutoGenerateColumns="False" 
    AllowSorting="True" Visible="true"> 
    <SelectedItemStyle CssClass="GridSelectedItem"></SelectedItemStyle> 
    <AlternatingItemStyle CssClass="GridAlternatingItem"></AlternatingItemStyle> 
    <ItemStyle CssClass="GridItem"></ItemStyle> 
    <HeaderStyle CssClass="GridHeader"></HeaderStyle> 
    <Columns> 
     <asp:TemplateColumn HeaderText="Lot Number"> 
      <ItemTemplate > 
       <asp:TextBox ID="txtLot" runat="server" Width="100%" Text='<%# DataBinder.Eval(Container, "DataItem.Lot") %>' /> 
      </ItemTemplate> 
     </asp:TemplateColumn> 
    </Columns> 
</asp:DataGrid> 

如何在后面的代码中禁用该列? 无论以下的正在

grdRequestTypeItem.Columns[1].IsReadOnly = true; 
((BoundField)grdRequestTypeItem.Columns[0]).ReadOnly = true; 
((TemplateField)grdRequestTypeItem.Columns[0]).EditItemTemplate = null; 

回答

2

试试这个:

<asp:DataGrid ID="grdRequestTypeItem" TabIndex="1" runat="server" CssClass="Grid" AutoGenerateColumns="False" AllowSorting="True" Visible="true" 
OnItemDataBound="grdRequestTypeItem_ItemBound"> 

,然后在后台代码...

protected void grdRequestTypeItem_ItemBound(Object sender, DataGridItemEventArgs e) 
{ 
     if((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem)) 
     { 
      TextBox txtLot = e.Item.FindControl("txtLot"); 

      if (txtLot != null) 
      { 
       txtLot.ReadOnly = true; 
      } 
     } 
} 

有人可以纠正我,如果我错了,在任何地方,因为我使用GridViews比DataGrids更多地工作,但据我所知,原理是一样的。

+0

见@ slfan的答案的答案循环等以及...使用EditItemTemplate中可能更容易。 – CodeCanuck

3

即使您的DataGrid不在EditMode中,它也会在ItemTemplate内显示TextBox。否则,您使用EditItemTemplate。这就是为什么您的解决方案无法工作。您有几种选择:

  • 将一个<asp:Literal>控制到您的ItemTemplate
  • 绑定TextBoxReadOnly属性从代码的视图模型
  • 的布尔值的背后,你必须解决的正确控制

,你可以使用类似这样的项目模板中引用的文本框

foreach (GridViewRow row in grdRequestTypeItem.Rows) 
{ 
    var txtLot = row.FindControl("txtLot") as TextBox; 
    txtLog.IsReadOnly = true; 
} 

你也可以使用数据绑定事件对行而不是通过行中@ Stealth22

+0

完全滑了我的脑海,在(facepalm)TemplateField中有多个模板类型!这实际上是一个更简单的方法。 – CodeCanuck

相关问题