我试图让一个 ASP.NET 3.5 GridView 在显示时将选定的值显示为字符串,并显示一个 DropDownList 以允许我在编辑时从给定的选项列表中选择一个值。看起来很简单?
我的 gridview 看起来像这样(简化):
<asp:GridView ID="grvSecondaryLocations" runat="server" 
              DataKeyNames="ID" OnInit="grvSecondaryLocations_Init" 
              OnRowCommand="grvSecondaryLocations_RowCommand" 
              OnRowCancelingEdit="grvSecondaryLocations_RowCancelingEdit"
              OnRowDeleting="grvSecondaryLocations_RowDeleting"
              OnRowEditing="grvSecondaryLocations_RowEditing" 
              OnRowUpdating="grvSecondaryLocations_RowUpdating"  >
<Columns>
    <asp:TemplateField>
         <ItemTemplate>
              <asp:Label ID="lblPbxTypeCaption" runat="server" 
                                 Text='<%# Eval("PBXTypeCaptionValue") %>' />
         </ItemTemplate>
         <EditItemTemplate>
                      <asp:DropDownList ID="ddlPBXTypeNS" runat="server" 
                               Width="200px" 
                               DataTextField="CaptionValue" 
                               DataValueField="OID" />
         </EditItemTemplate>
    </asp:TemplateField>
</asp:GridView>
网格在不处于编辑模式时显示正常 - 选定的 PBX 类型在 asp:Label 控件中显示其值。那里并不奇怪。
我将 DropDownList 的值列表加载到表单事件中调用_pbxTypes的本地成员中。OnLoad我验证了这一点 - 它有效,值在那里。
现在我的挑战是:当网格进入特定行的编辑模式时,我需要绑定存储在_pbxTypes.
很简单,我想 - 只需抓住事件中的下拉列表对象RowEditing并附加列表:
protected void grvSecondaryLocations_RowEditing(object sender, GridViewEditEventArgs e)
{
    grvSecondaryLocations.EditIndex = e.NewEditIndex;
    GridViewRow editingRow = grvSecondaryLocations.Rows[e.NewEditIndex];
    DropDownList ddlPbx = (editingRow.FindControl("ddlPBXTypeNS") as DropDownList);
    if (ddlPbx != null)
    {
        ddlPbx.DataSource = _pbxTypes;
        ddlPbx.DataBind();
    }
    .... (more stuff)
}
麻烦的是 - 我从来没有从FindControl电话中得到任何回报 - 似乎ddlPBXTypeNS不存在(或找不到)。
我错过了什么??一定是真的很愚蠢......但到目前为止,我所有的谷歌搜索、阅读 GridView 控件和询问好友都没有帮助。
谁能发现缺失的链接?;-)