1

我有以下数据网格视图,它与数据库中的一些数据绑定了数据

我需要在数据网格中加载信息并使某些列中的所有文本框(在示例中仅出现但有很多)为只读或禁用。

<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;
4

2 回答 2

3

即使您DataGrid不在 EditMode 中,它也会TextBox显示ItemTemplate. 否则,您使用EditItemTemplate. 这就是为什么您的解决方案都不起作用的原因。你有几个选择:

  • <asp:Literal>控件放入您的ItemTemplate
  • ReadOnly将 的属性绑定TextBox到 viewModel 的 bool 值
  • 从后面的代码,你必须解决正确的控制

你可以使用这样的东西来引用项目模板中的文本框

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

您还可以在行上使用 DataBinding 事件,而不是像@Stealth22 的答案那样循环遍历行

于 2013-10-29T21:56:18.053 回答
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 更多,但据我所知,原理是相同的。

于 2013-10-29T21:42:59.283 回答