如何从GridViewRow强制转换WebControl
本文关键字:转换 WebControl GridViewRow | 更新日期: 2023-09-27 18:21:43
我有一些GridView
,列的数量在变化。只有最后一列总是相同的,但它们没有相同的名称。
<asp:GridView>
<%-- columns are here--%>
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton>
</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</asp:GridView>
现在我循环浏览页面,禁用特定状态下的所有控件:
public static void disableControls(ContentPlaceHolder cph)
{
foreach (Control c in cph.Controls)
{
disableControl(c);
foreach (Control c2 in c.Controls)
{
//and so on, this goes until 20 controls deep
}
}
}
在我的disableControl()
中,我检查所有类型(TextBox
、Button
等),然后禁用它们。唯一的例外是GridView
。因为如果我禁用它们,它们就不能再滚动了。所以我试着保持GridView
的启用状态,只在行中循环,并尝试将每个单元格强制转换为LinkButton
以禁用它。因为不知何故,它们不会在我的所有控件及其子控件的正常循环中被禁用。但这也不起作用,因为他们从来没有被铸造。我一直在尝试(但没有成功):
尝试1:
foreach (GridViewRow gvr in gv.Rows)
{
if (gvr.RowType == DataControlRowType.DataRow)
{
for (int i = 0; i < gv.Columns.Count; i++)
{
try
{
System.Web.UI.WebControls.LinkButton lb = (System.Web.UI.WebControls.LinkButton)gvr.Cells[i].Controls[0];
lb.Enabled = false;
}
catch(Exception)
{}
}
}
}
尝试2:
foreach (GridViewRow gvr in gv.Rows)
{
foreach (TableCell cell in gvr.Cells)
{
foreach (Control con in cell.Controls)
{
try
{
System.Web.UI.WebControls.LinkButton lb = (System.Web.UI.WebControls.LinkButton)con;
lb.Enabled = false;
}
catch (Exception)
{ }
}
}
}
如何确保GridView
中的LinkButton
被禁用,但GridView
本身没有被禁用?
顺便说一句:写了这么长的文字后,我想到了什么:"Parent"-Controls(The GridViews)Enabled
-Status是否可能覆盖"Child"-Controls-Enabled Status?!
问题是您的检查假设它是一个链接按钮,但您首先键入check控件:
if (lb is System.Web.UI.WebControls.LinkButton)
{
((System.Web.UI.WebControls.LinkButton)con).Enabled = false
}
您也可以在WebControl上键入check,并以这种方式禁用所有web控件。
我绕过它,手动禁用面板的所有控件(循环遍历面板的子级及其子级等)
不知何故,如果手动将所有WebControls设置为禁用,"scrollable"-函数不会丢失,如果仅将Panel设置为禁用则会继承它,GridView的"scrollable-"函数也会丢失。