在运行时更改sqldatasource的select命令

本文关键字:select 命令 sqldatasource 运行时 | 更新日期: 2023-09-27 18:28:50

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命令更改网格视图?

在运行时更改sqldatasource的select命令

这是因为GridView的视图状态。

当发生回发时,gridview从ViewState存储其数据。因此,您可以关闭GridView的视图状态(这是一种很好的做法吗?),也可以在SqlDataSource.Databind(); 之外调用GridView.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时,不需要在page_Load中调用GridView.DataBind(),如上面的方法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
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();

您可以编辑BoundField或将属性AutoGenerateColumns更改为true

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

尝试添加以下内容:

 SqlDataSource.select(DataSourceSelectArguments.Empty);

SqlDataSource.DataBind(); 之前