我有一个GridView (gvPart),其中SqlDataSource (sdsParts)是其数据源。在gvPart上,我具有属性AllowPaging="true"。我也有一个TextBox (txtPartSearch)Button,它们用于输入和执行通过gvPart的搜索。为此,我在代码中包含以下内容:

protected void partSearch(object sender, EventArgs e)
{
    string query = txtPartSearch.Text;
    string selectCmd = "SELECT ... WHERE partnum LIKE '" + query + "%' ... "; // I have cut out most of the statement for clarity
    sdsParts.SelectCommand = selectCmd;
    gvPart.DataBind();
}


这样做的目的是允许用户输入零件号,并使gvPart仅显示与查询匹配的零件,而不是整个列表。

按照上述方法,gvPart的第一页是预期的。但是,如果此select语句导致gvPart中有多个页面,则单击页脚中的第2页将显示第二页,但数据将来自原始数据的第2页(即最初的数据在搜索之前被拉,默认为SelectCommand

好像分页“重置” sdsParts并使用在Default.aspx中编写的SqlDataSource,而不管任何SelectCommand语句如何。

我试着完全省略sdsParts.SelectCommand = selectCmd,所以SelectCommand看起来像这样:

<asp:SqlDataSource ID="sdsParts" runat="server" ConnectionString="..." />


然后在sdsParts中添加默认值:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        string selectCmd = "SELECT ... ";
        sdsParts.SelectCommand = selectCmd;
        gvPart.DataBind();
    }
}


但随后单击Page_Load中的另一页将其空白,就像gvPart一样。

为什么SelectCommand=""SelectCommand会“重置”,我该如何解决/避免这种情况?

编辑

我已经解决了我的问题。对于那些来这里遇到同样问题的人,请单击此处以获取解释和建议,以寻求解决方法。

编辑将我的上述解决方案移至答案以更清晰

最佳答案

为什么要在后面的代码中更改SqlDataSource的SelectCommand?将其放在控件中。

第二,您的代码容易受到SQL注入攻击,请不要将用户提供的数据连接到TSQL中。

举个例子,然后是一个痛苦的快速课程,运行程序,然后输入以下内容,输入零件代号';DROP TABLE PARTS;',然后在哭完之后;如果老板不解雇您,请更改代码。

10-08 11:40