在运行时更改sqldatasource的select命令

时间:2012-03-24 18:25:31

标签: c# asp.net data-binding gridview sqldatasource

HTML

 <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="id" DataSourceID="SqlDataSource1">
   <Columns>
       <asp:BoundField DataField="id" HeaderText="id"  />
       <asp:BoundField DataField="name" HeaderText="name" />
   </Columns>
 </asp:GridView>

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:database1ConnectionString %>"
SelectCommand="SELECT * from tblCourse"></asp:SqlDataSource>

代码

 SqlDataSource1.SelectCommand =
        "SELECT  * from tblCourse where name='"+textbox1.text+"'";
  SqlDataSource1.DataBind();

但是Gridview不会根据新的select命令进行更改,即使我正在使用DataBind()

我们如何根据sql数据源的select命令更改网格视图?

5 个答案:

答案 0 :(得分:3)

这是因为GridView的视图状态而发生的。

当发生回发时,gridview会从ViewState存储其数据。那么,您可以关闭GridView的视图状态(一个好的做法??)或者除GridView.DataBind()之外还调用SqlDataSource.Databind();

方法1 :致电GridView.DataBind();

protected void Page_Load(object sender, EventArgs e)
 {
     if (this.IsPostBack)
     {
        string command = SqlDataSource1.SelectCommand; // added just for debug purpose
        SqlDataSource1.SelectCommand = "SELECT  * from tblCourse where 
                                        name='"+textbox1.text+"'";
        SqlDataSource1.DataBind();
        gridview1.DataBind();
      }

  }

方法2 :关闭GridView的视图状态(这是一个很好的练习吗?)。设置此false后,无需在GridView.DataBind()中调用page_Load,如上面的方法1所示。

<asp:GridView runat="server" ID="gridview1" EnableViewState="false" ...  />

现在应该照顾的部分::

确保<asp:BoundField>或通常声明并绑定到GridView标记的任何字段也出现在您的新查询中,否则将引发错误,说明类似于以下内容:

A field or property with the name 'ID' was not found on the selected data source

答案 1 :(得分:0)

您可以修改您的BoundField,也可以将属性AutoGenerateColumns更改为true

答案 2 :(得分:0)

string strSql= "SELECT  * from tblCourse where name='abc'";
ViewState["SQL"]=strSql;
SqlDataSource1.SelectCommand =strSql;        
SqlDataSource1.DataBind();

现在在Page_Load

if(IsPostback)
     SqlDataSource1.SelectCommand=ViewState["SQL"].ToString();

答案 3 :(得分:0)

将autogenerate设置为true,并确保删除编辑字段向导中的所有字段。如果更改select命令,则会导致冲突。

答案 4 :(得分:0)

尝试添加以下内容:

 SqlDataSource.select(DataSourceSelectArguments.Empty);

行[{1}}

之前