我有以下数据网格视图,它是与数据库
中的某些数据绑定的数据我需要在数据网格中加载信息,并使某些列中的所有文本框(在示例中仅出现,但有很多)可以只读或禁用。
<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;
答案 0 :(得分:3)
即使您的DataGrid
不在EditMode中,它也会在TextBox
内显示ItemTemplate
。否则,您使用EditItemTemplate
。这就是为什么你的解决方案都不起作用的原因您有几种选择:
<asp:Literal>
控件放入ItemTemplate
ReadOnly
的{{1}}属性绑定到viewModel的bool值您可以使用类似的内容来引用项目模板中的文本框
TextBox
您还可以在行上使用DataBinding事件,而不是像@ Stealth22的答案那样循环遍历行
答案 1 :(得分: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,但据我所知,原理是一样的。