ASP.NET Gridview Загрузка медленнее с большим количеством привязок данных - PullRequest
0 голосов
/ 06 января 2012

Я использую Visual Studio 2010 и SQL Server 2008 и заполняю свой gridview с помощью sqldatasoure. И внутри itemtemplate gridview есть некоторый выпадающий список, который снова связывается с sqldatasource, и при событии rowdatabound назначаю выбранные значения для этих выпадающих списков.Существует более 2000 записей, что делает загрузку сетки очень медленной.Любые идеи по оптимизации этого.

  <form id="form1" runat="server">
  <div>
  <asp:GridView ID="Gridview1" runat="server" DataSourceID="SqlDataSource1" 
      AutoGenerateColumns="False" onrowdatabound="Gridview1_RowDataBound">
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:DropDownList ID="Dropdownlist1" runat="server" DataSourceID="SqlDataSource2" DataTextField="empid" DataValueField="empname">
                    </asp:DropDownList>
                    <asp:HiddenField ID="HiddenField1" runat="server" Value='<%# Eval("empid") %>' />
                    <asp:DropDownList ID="Dropdownlist2" runat="server" DataSourceID="SqlDataSource3" DataTextField="desgid" DataValueField="desgname">
                    </asp:DropDownList>
                    <asp:HiddenField ID="HiddenField2" runat="server" Value='<%# Eval("desgid") %>' />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString='<%$     ConnectionStrings:dbconn %>'
    SelectCommandType="StoredProcedure" SelectCommand="SP_Fetch_Grid">    </asp:SqlDataSource>
    <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString='<%$ ConnectionStrings:dbconn %>'
    SelectCommandType="StoredProcedure" SelectCommand="SP_Fetch_DDL1"></asp:SqlDataSource>
    <asp:SqlDataSource ID="SqlDataSource3" runat="server" ConnectionString='<%$ ConnectionStrings:dbconn %>'
    SelectCommandType="StoredProcedure" SelectCommand="SP_Fetch_DDL2"></asp:SqlDataSource>
</div>
</form>

protected void Gridview1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        HiddenField hf1 = (HiddenField)e.Row.FindControl("HiddenField1");
        HiddenField hf2 = (HiddenField)e.Row.FindControl("HiddenField2");
        DropDownList ddl1 = (DropDownList)e.Row.FindControl("DropDownList1");
        DropDownList ddl2 = (DropDownList)e.Row.FindControl("DropDownList2");
        ddl1.SelectedValue = hf1.Value;
        ddl2.SelectedValue = hf2.Value;
    }
}

Ответы [ 3 ]

3 голосов
/ 06 января 2012
  1. Не отображать 2000 строк чего-либо одновременно.
  2. Настройка подкачки на вашем GridView.
  3. Если первые два элемента не помогли, рассмотрите возможность переключения на элемент управления Repeater.
  4. Убедитесь, что ваш запрос SQL возвращает ваши данные в разумные сроки (2-3секунд).
1 голос
/ 06 января 2012

Потяните выпадающий список, установленный один раз, в память и свяжите с ним.Это сэкономит вам 2000+ обращений к серверу.

Редактирование - создайте небольшой класс, что-то вроде этого:

public static class DropDownListCache
{
    private static Func<DataTable> m_getDataFunc = 
            () => AccessYourDAL.GetYourDropdownListTableData1();
    private static Func<DataTable> m_getDataFunc = 
            () => AccessYourDAL.GetYourDropdownListTableData2();

    private static Lazy<DataTable> DropDown1 = 
            new Lazy<TDataType>(m_getDataFunc1,true);
    private static Lazy<DataTable> DropDown2 = 
            new Lazy<TDataType>(m_getDataFunc2,true);

    public static DataTable GetDropDownList1()
    {
        return DropDown1;
    }

    public static DataTable GetDropDownList2()
    {
        return DropDown2;
    }
}

Затем замените SqlDataSource2 и SqlDataSource3 объектными объектами источника данных, которые указывают на два метода объекта кеша.

Вам нужно написать код для AccessYourDAL.GetYourDropdownListTableData1(); и AccessYourDAL.GetYourDropdownListTableData2();

Это просто заполнители.Это должно гарантировать, что вы платите только 2 раунда за всю сетку, а не 2 за строку.

1 + n * 2 вызовы базы данных становятся 1 + 2 вызовами базы данных.

0 голосов
/ 06 января 2012

Одной из альтернатив может быть оптимизация SQL-запроса путем добавления индекса для столбца, который используется для заполнения DropDownList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...