如何从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()中,我检查所有类型(TextBoxButton等),然后禁用它们。唯一的例外是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?!

如何从GridViewRow强制转换WebControl

问题是您的检查假设它是一个链接按钮,但您首先键入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-"函数也会丢失。