我有一个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'
知道为什么会这样吗?
答案 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并不总是“聪明”。