【问题标题】:Cannot find control in EditTemplate via OnRowEditing event无法通过 OnRowEditing 事件在 EditTemplate 中找到控件
【发布时间】:2012-10-26 18:54:24
【问题描述】:

我有一个像这样的GridView

<asp:GridView runat="server" ID="grdPractices" PageSize="10" AutoGenerateColumns="False" DataKeyNames="Id" 
    CssClass="linkGrid" AllowSorting="True" OnSorting="grdPractices_OnSorting" OnRowDataBound="grdPractices_OnRowDataBound"
    OnRowEditing="grdPractices_OnRowEditing" OnRowCancelingEdit="grdPractices_OnRowCancelingEdit" OnRowUpdating="grdPractices_OnRowUpdating">
    <Columns>
        <asp:BoundField DataField="Name" HeaderText="Name" meta:resourcekey="PracticeName" ReadOnly="True" SortExpression="Name" ItemStyle-Width="400px" />
        <asp:BoundField DataField="Code" HeaderText="Code" meta:resourcekey="Code" ReadOnly="True" SortExpression="Code" ItemStyle-Width="200px" />
        <asp:TemplateField meta:resourcekey="SiteName" ItemStyle-Width="200px" SortExpression="SiteName">
            <ItemTemplate>
                <asp:Literal runat="server" Text='<%# Eval("SiteName") %>' />
            </ItemTemplate>
            <EditItemTemplate>
                <asp:DropDownList runat="server" ID="lstSites" />
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField meta:resourcekey="NumOfUsers" ItemStyle-Width="200px" SortExpression="NumOfUsers">
            <ItemTemplate>
                <asp:LinkButton runat="server" OnCommand="OnLinkButtonCommand" CommandName="ViewUsers" Text='<%# Eval("NumOfUsers") %>' />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:CommandField ShowDeleteButton="False" ShowCancelButton="True" 
            ShowInsertButton="False" ShowEditButton="True" EditText="Edit"
            CancelText="Cancel" UpdateText="Update" meta:resourcekey="Edit" ItemStyle-Width="200px" />
    </Columns>
</asp:GridView>

这里是 OnRowEditing 事件的代码:

protected void grdPractices_OnRowEditing(object sender, GridViewEditEventArgs e)
{
    this.grdPractices.EditIndex = e.NewEditIndex;

    var sitesDropDown = this.grdPractices.Rows[e.NewEditIndex].Controls[0].FindControl("lstSites") as DropDownList;

    if (sitesDropDown == null)
    {
        return;
    }
}

我的问题是我无法获取位于 EditTemplate 中的 lstSites 控件。我试过使用以下方法:

  • this.grdPractices.Rows[e.NewEditIndex].Controls[0].FindControl("lstSites") 作为下拉列表;
  • this.grdPractices.Rows[e.NewEditIndex].FindControl("lstSites") as 下拉列表;
  • this.grdPractices.Rows[e.NewEditIndex].FindControlRecursive("lstSites") 作为下拉列表;

结果总是一样的,返回一个NULL

在 OnRowEditing 事件中你到底应该如何获得一个连续的控件?

【问题讨论】:

    标签: asp.net gridview edit


    【解决方案1】:

    好吧,在这行之后我没有做什么:

    this.grdPractices.EditIndex = e.NewEditIndex;

    然后重新绑定网格的数据。所以重新绑定数据后,再调用:

    var sitesDropDown = this.grdPractices.Rows[e.NewEditIndex].FindControlRecursive("lstSites") as DropDownList;
    

    我现在可以与 siteDropDown 变量进行交互,因为它现在包含对 lstSites 控件的引用。

    【讨论】:

      【解决方案2】:

      尝试如下使用GridViewRow...

      protected void grd_RowEditing(object sender, GridViewEditEventArgs e) 
      {
           GridViewRow selectRow = grd.Rows(e.NewEditIndex);
           DropDownList sitesDropDown =(DropDownList)selectRow.Cells[2].FindControl("lstSites"); 
      }
      

      【讨论】:

      • 试过你的建议,但恐怕没有乐趣。我会稍微修改一下,但在这种情况下,我讨厌 ASP.NET WebForms,更喜欢 ASP.NET MVC。少了很多麻烦。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 2011-02-11
      相关资源
      最近更新 更多