我应该如何使用GridViews?

时间:2010-09-24 13:47:40

标签: c# gridview updatepanel sqldatasource

我遇到的最近问题让我质疑我对GridViews的整体理念和假设。

目前,我已经使用了以下模型的内容。

标记:

<asp:UpdatePanel ID="pnlSearch" UpdateMode="Conditional" runat="server">
    <ContentTemplate>
            <asp:TextBox ID="txtSearch" runat="server" 
                ontextchanged="txtSearch_TextChanged"></asp:TextBox>
    </ContentTemplate>
</asp:UpdatePanel>

<asp:UpdatePanel ID="pnlGridView" UpdateMode="Conditional" runat="server">
    <ContentTemplate>
        <asp:GridView ID="GridView1" EnableViewState="false" AllowPaging="true" PageSize="20" DataSourceID="MyDataSource" runat="server" AutoGenerateColumns="False">
            <Columns>
                <asp:BoundField DataField="COL_1" HeaderText="Happy Data" SortExpression="COL_1" />
                <asp:BoundField DataField="COL_2" HeaderText="Happy Related Data" SortExpression="COL_2" DataFormatString="{0:M/dd/yyyy}" />
            </Columns>
        </asp:GridView>
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="txtSearch" EventName="TextChanged" />
    </Triggers>
</asp:UpdatePanel>
<asp:SqlDataSource ID="MyDataSource" runat="server"></asp:SqlDataSource>

非常基本的东西。一个GridView。数据源。用于搜索结果的文本框。我只包括UpdatePanels,因为我有点确信它们可能是我问题的一部分。

在我的代码背后,我通常会做这样的事情:

protected void Page_Load(object sender, EventArgs e)
{

    if (!IsPostBack)
    {
        MyDataSource.ConnectionString = ConfigurationManager.ConnectionStrings["OracleConnectionString"].ConnectionString;
        MyDataSource.ProviderName = ConfigurationManager.ConnectionStrings["OracleConnectionString"].ProviderName;
        GridView1.EmptyDataText = "No comments found.";
        PopulateGridView();
    }
}

protected void PopulateGridView()
{
    string strQuery = @"SELECT  COL_1,
                          COL_2
                    FROM  some_table
                   WHERE  COL_3 = :important_filter";

    MyDataSource.SelectCommand = strQuery;
    MyDataSource.SelectParameters.Clear();
    MyDataSource.SelectParameters.Add(":important_filter", Request.QueryString["filter"]);
    GridView1.DataBind();
    GridView1.PageIndex = 0;
}

protected void txtSearch_TextChanged(object sender, EventArgs e)
{
    string strQuery = @"SELECT  COL_1,
                          COL_2
                    FROM  some_table
                   WHERE  COL_3 = :important_filter AND lower(COL_2) LIKE :search";
    MyDataSource.SelectCommand = strQuery;
    MyDataSource.SelectParameters.Clear();
    MyDataSource.SelectParameters.Add(":important_filter", Request.QueryString["filter"]);
    MyDataSource.SelectParameters.Add(":search", "%" + txtSearch.Text.Trim().ToLower() + "%");
    GridView1.DataBind();
    GridView1.PageIndex = 0;
}

没什么太花哨的。我最初将数据源连接到配置文件中的连接字符串(在多实例环境中是必需的),连接查询和数据绑定。在搜索时,我更改查询并重新绑定。

唯一的问题?

以上不起作用。为什么?数据源在回发时丢失了它的查询,连接字符串,提供程序名称等。因此,gridview自杀了。当我尝试更改页面时,会发生同样的事情......无论是初始加载还是填充搜索。

我上周通过手动将数据源添加到控制状态并从控制状态重新填充值来“解决”了这个问题,但这似乎是黑客的。

我不理解什么?

1 个答案:

答案 0 :(得分:1)

您将更新模式设置为条件,因此您需要在'pnlGridView'上调用update

GridView1.DataBind();
GridView1.PageIndex = 0;
pnlGridView.Update();

我还会改变你使用DataSource的方式

 <asp:SqlDataSource ID="ProductsDataSource" runat="server"
    ConnectionString="<%$ ConnectionStrings:OracleConnectionString %>"
    SelectCommand="SELECT  COL_1, COL_2 FROM  some_table WHERE  COL_3 = @important_filter">

  <SelectParameters>
     <asp:ControlParameter ControlID="textBox?not sure where this is coming from" PropertyName="SelectedValue" Name="important_filter" Type="string" DefaultValue="" />
   </SelectParameters>
 </asp:SqlDataSource>

您还可以使用服务器端事件处理程序并手动设置重要过滤器。

protected void SQLDataSource_Selecting(object sender, SQLDataSourceSelectingEventArgs e) {
    e.InputParameters["important_filter"] = "whatever";
 }

将事件添加到SQLDataSource的标记中。

<asp:SqlDataSource ID="MyDataSource" runat="server"     OnSelecting="SQLDataSource_Selecting" />