GridView和DropDownlist

时间:2012-04-23 07:47:40

标签: asp.net .net

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

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

现在我有一个SqlDataSource更新方法,在这个aspx文件中定义:

<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'

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

是。 ControlParameters仅在DOM可以找到您所指的控件时才有效,该控件位于GridView的同一分支内。问题是Gridviews是一种处理DOM控件的糟糕方式,因为只要你进入GridView的“模式”(如EDIT模式),整个DOM结构就会发生变化。顺便说一句,DOM是文档对象模型。因为它已经改变,所以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并不总是“聪明”。