在 GridView 中正确使用 FindControl()

本文关键字:FindControl GridView | 更新日期: 2023-09-27 17:57:25

我继承了一些代码,其中充斥着 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()的力量?

在 GridView 中正确使用 FindControl()

经过一些实验,我发现以下内容工作得很好。

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

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

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

<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>
Label myLabel = e.row.FindControl("myControl") as Label;
if(myLabel !=null)
{
     // Do some work
 }

我更喜欢用于铸造。