1

我继承了一些代码,到处都是 GridView,我注意到该OnItemDataBound方法中有以下几种引用:

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

“问题”是lblSomething并且lblSomethingElse实际上不在同一个单元格中,但它们似乎都在正常工作。简化一点:

<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()

4

2 回答 2

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>
于 2013-02-01T22:51:49.253 回答
0
Label myLabel = e.row.FindControl("myControl") as Label;
if(myLabel !=null)
{
     // Do some work
 }

我更喜欢使用 as 进行铸造。

于 2013-02-04T08:49:43.840 回答