0

我有一个gridview,当进入编辑模式时,其中一列更改为下拉列表:

     <EditItemTemplate>
          <asp:DropDownList ID="DropDownList2" runat="server" 
          DataSourceID="SqlDataSource1" DataTextField="name" DataValueField="name">
          </asp:DropDownList>
     </EditItemTemplate>

现在我有一个SqlDataSource在这个 aspx 文件中定义的 with update 方法:

<UpdateParameters>
       <asp:Parameter Name="name" Type="String" />
       <asp:ControlParameter ControlID="DropDownList2" Type="string" 
                PropertyName="SelectedValue" Name="genre" />
</UpdateParameters>

现在我想获取选定的值并将其插入,但是当我按下 gridview 行中的更新按钮时,我收到此错误:

Could not find control 'DropDownList2' in ControlParameter 'genre'

知道为什么会这样吗?

4

1 回答 1

1

是的。ControlParameters仅当 DOM 可以找到您所指的控件位于GridView. 问题是 Gridviews 是一种处理 DOM 控件的糟糕方式,因为一旦您进入 GridView 的“模式”,如 EDIT 模式,整个 DOM 结构就会发生变化。顺便说一下,DOM 是Document Object Model。因为它已更改,因此 ASP 找不到您所指的控件。

我通过做两件事之一克服了这个问题。

首先通过简单地将控件名称与'$'字符尾随来查看它是否有效。

<UpdateParameters>
       <asp:Parameter Name="name" Type="String" />
       <asp:ControlParameter ControlID="MyGridView$DropDownList2" Type="string" 
                PropertyName="SelectedValue" Name="genre" />
</UpdateParameters>

如果幸运的话,这有时会起作用。

如果没有,那么您需要找到控件,获取它的值并将其以编程方式在后面的代码中传递给 SQL 参数。

尝试这样的事情(我使用 C#)...

protected void MyGridView_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
   ...
   GridViewRow gvRow = (GridViewRow)sender;
   DropDownList myDDL = (DropDownList)gvRow.FindControl("DropDownList2");
   if (myDDL != null)
   {
      //assuming your datasource is outside the gridview, you have to find it!
      SqlDataSource sds1 = (SqlDataSource)page.FindControl("myDataSource");
      if (sds1 != null)
      {
         sds1.UpdateParameter["genre"].DefaultValue = myDDL.SelectedValue;
         ... and do your databinding etc
         sds1.Update();
      }
   }
}

我总是依靠客户端代码 (ASPX) 为我完成大部分工作,例如Bind(),Eval()等,但随着时间的推移,您会意识到要真正控制您的程序,您必须依赖 JavaScript 或代码后面做更精细的位。ASP 在做你期望它做的事情时并不总是“聪明”的。

于 2018-04-10T06:52:36.260 回答