Недавние проблемы, с которыми я столкнулся, заставляют меня подвергнуть сомнению всю мою философию и предположения относительно 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 совершает самоубийство. То же самое происходит, когда я пытаюсь изменить страницы ... либо при начальной загрузке, либо при заполненном поиске.
Я «решил» эту проблему на прошлой неделе, вручную добавив источник данных для управления состоянием и заново заполнив значения из состояния управления, но это кажется хакерским.
Что я не понимаю?