我有一个带有简单数据驱动gridview的.net webform:
<asp:TextBox ID="txtCodeSearch" runat="server" Width="250px"></asp:TextBox>
<br />
<asp:Button ID="btnCodeSearch" runat="server" Text="Search" CssClass="button-tiny"
onclick="btnCodeSearch_Click" />
<asp:Gridview id="gvTest" runat="server">
<Columns>
<asp:CommandField ShowEditButton="True" HeaderText="Action" />
<asp:BoundField DataField="Field1" />
<asp:BoundField DataField="Field2" />
<asp:BoundField DataField="CodeID" HeaderText="" ReadOnly="true" Visible="false" />
</Columns>
</asp:Gridview>
<asp:SqlDataSource ID="dsTest" runat="server"
ConnectionString="<%$ ConnectionStrings:SQLConn %>"
SelectCommand="SelectCodes"
SelectCommandType="StoredProcedure"
>
<SelectParameters>
<asp:QueryStringParameter Name="FooID" QueryStringField="FooID" Type="String" />
</SelectParameters>
</asp:SqlDataSource>
1)在页面加载时,前端sqdatasource使用查询字符串中的变量填充gridview,FooID
2)当上面的文本框中填充了代码并按下按钮时,我在代码隐藏中运行以下内容:
protected void btnCodeSearch_Click(object sender, EventArgs e)
{
string CodeName = string.Empty;
CodeName = txtCodeSearch.Text;
string FooID= string.Empty;
FooID = Request.QueryString["FooID"];
if (!string.IsNullOrEmpty(CodeName))
{
dsTest.SelectParameters.Clear();
dsTest.SelectCommand = "SelectCodesWithFilter";
dsTest.SelectParameters.Add("FooID", FooID);
dsTest.SelectParameters.Add("CodeName", CodeName);
}
else
{
dsTest.SelectParameters.Clear();
dsTest.SelectCommand = "SelectCodes";
}
gvTest.DataBind();
}
简而言之,在存储过程中运行不同的select语句,以使用额外的过滤器填充gridview。如果文本框中没有任何内容,则将gridview填充到原始存储过程
这一切都很完美。问题是,gridview具有编辑功能。如果在从第一个存储过程(SelectCodes)填充网格时启用了编辑模式,则它可以正常工作。如果我向下过滤网格并且它由SECOND存储过程(SelectCodesWithFilter)填充并且我进入编辑模式,它告诉我我试图向FIRST存储过程添加太多参数。
我很难过,我无法弄清楚它为什么这样做。任何帮助表示赞赏。
答案 0 :(得分:0)
我还没试过,但我发现*这段代码要切换到另一个查询:
SqlDataSource1.SelectCommand = "SELECT x FROM MyTable";
SqlDataSource1.Select(DataSourceSelectArguments.Empty);
SqlDataSource1.DataBind();
GridView1.DataBind();
我注意到SqlDataSource上的DataBind()命令,在GridView上的命令之前。这会对你产生影响吗?
*来源:http://forums.asp.net/t/1535310.aspx?Changing+Select+Command+of+SQLDataSource+from+code+behind