在GridView中正确使用FindControl()

时间:2013-02-01 22:23:14

标签: c# asp.net gridview

我继承了一些充满GridView的代码,我注意到OnItemDataBound方法中的以下类型的引用:

Label lblSomething = (Label)e.Row.Cells[3].FindControl("lblSomething");
Label lblSomethingElse = (Label)e.Row.Cells[3].FindControl("lblSomethingElse");

“问题”是lblSomethinglblSomethingElse实际上不在同一个单元格中,但无论如何它们似乎都正常工作。简化一下:

<Columns>
    <asp:TemplateField runat="server" HeaderText="Online materials available to assign">
        <ItemTemplate>
            <asp:Label ID="lblThis" runat="server"></asp:Label>
        </ItemTemplate>
    </asp:TemplateField>

    <asp:TemplateField HeaderText="Assign" HeaderStyle-Width="75px">
        <ItemTemplate>
            <asp:Label ID="lblThat" runat="server"></asp:Label>
        </ItemTemplate>
    </asp:TemplateField>

    <asp:TemplateField HeaderText="Assign" HeaderStyle-Width="75px">
        <ItemTemplate>
            <asp:Label ID="lblSomething" runat="server"></asp:Label>
        </ItemTemplate>
    </asp:TemplateField>

    <asp:TemplateField HeaderText="Assign" HeaderStyle-Width="75px">
        <ItemTemplate>
            <asp:Label ID="lblSomethingElse" runat="server"></asp:Label>
        </ItemTemplate>
    </asp:TemplateField>                        

</Columns>

预计会出现这种情况吗?如果我使用FindControl()的哪个单元格无关紧要,我可以安全/可靠地简化它吗?

Label lblSomething = (Label)e.Row.FindControl("lblSomething");
Label lblSomethingElse = (Label)e.Row.FindControl("lblSomethingElse");

如果没有,仅使用Cells[0].FindControl()是否可靠?

我是否应该担心细胞不匹配只能通过一次快乐的事故来解决,我需要尽快修复这些细胞指数,以免一切破裂?

或者,我是否低估了FindControl()的力量?

2 个答案:

答案 0 :(得分:2)

经过一些实验,我发现以下工作完全正常。

Label lblSomething = (Label)e.Row.FindControl("lblSomething");
Label lblSomethingElse = (Label)e.Row.FindControl("lblSomethingElse");

这是否是“最佳实践”超出了我的范围。

此外,我已从标记中的第一个runat="server"中删除TemplateField以匹配其他标记。显然,这是不必要的。 (谁知道?)

<Columns>
    <asp:TemplateField HeaderText="Online materials available to assign">
        <ItemTemplate>
            <asp:Label ID="lblThis" runat="server"></asp:Label>
        </ItemTemplate>
    </asp:TemplateField>

    <asp:TemplateField HeaderText="Assign" HeaderStyle-Width="75px">
        <ItemTemplate>
            <asp:Label ID="lblThat" runat="server"></asp:Label>
        </ItemTemplate>
    </asp:TemplateField>

    <asp:TemplateField HeaderText="Assign" HeaderStyle-Width="75px">
        <ItemTemplate>
            <asp:Label ID="lblSomething" runat="server"></asp:Label>
        </ItemTemplate>
    </asp:TemplateField>

    <asp:TemplateField HeaderText="Assign" HeaderStyle-Width="75px">
        <ItemTemplate>
            <asp:Label ID="lblSomethingElse" runat="server"></asp:Label>
        </ItemTemplate>
    </asp:TemplateField>                        

</Columns>

答案 1 :(得分:0)

Label myLabel = e.row.FindControl("myControl") as Label;
if(myLabel !=null)
{
     // Do some work
 }

我更喜欢使用铸造。