Как я должен использовать GridViews? - PullRequest
1 голос
/ 24 сентября 2010

Недавние проблемы, с которыми я столкнулся, заставляют меня подвергнуть сомнению всю мою философию и предположения относительно 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 Ответ

1 голос
/ 24 сентября 2010

У вас установлен режим обновления на условный, поэтому вам нужно вызвать update для 'pnlGridView'

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

Я бы также уточнил, как вы используете свой источник данных

 <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" />
...