我有一个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;'
,然后在哭完之后;如果老板不解雇您,请更改代码。