Исключение: «System.OutOfMemoryException» возникало, когда в RadComboBox внутри RadGrid необходимо связать более 20 000 данных.

У меня есть RadGrid и RadComboBox вне RadGrid (скажем, comboOutside), внутри веб-формы.
Внутри RadGrid есть Еще 1 RadComboBox (например, comboRadGrid). При выборе элементов из comboOutside, comboRadGrid привязывается, т.е. если элемент «Компания» выбран из comboOutside, то все названия компаний будут привязаны в comboRadGrid; а затем пользователь выбирает конкретную компанию из comboRadGrid, и записи добавляются в RadGrid.

Для всех элементов функциональность работает нормально, но я столкнулся с проблемой привязки определенного элемента comboOutside. т.е., когда я выбираю конкретный элемент из comboOutside, скажем, у меня есть 100 элементов внутри comboOutside, и когда я выбираю из него 35-е элементы, то comboRadGrid всегда выдает эту ошибку при привязке записей для 35-го элемента (поскольку 35-й элемент имеет 2000+ записей для привязки в comboRadGrid)
Ниже приведена ошибка: введите здесь описание изображения

Функциональность работает нормально для всех элементов, кроме одного конкретного элемента RadComboBox. Я не понимаю, почему. Из-за этого я не могу добавлять записи в RadGrid
Ниже приведен мой код - код C#

public DataTable GetAccCode(string CompanyCode)
    {
        SqlConnection con = new SqlConnection(strcon);
        SqlCommand cmd = new SqlCommand("[Invoice].[usp_tbl_AccountCode_DL_Test]", con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@CompanyCode", CompanyCode);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        try
        {
            con.Open();
            da.Fill(dt);
            con.Close();
        }
        catch (Exception ex)
        {
        }
        return dt;
    }
protected void RGGSTAcCode_ItemDataBound(object sender, GridItemEventArgs e)
    {
        if (e.Item is GridEditableItem && e.Item.IsInEditMode)
        {
            //bind dropdwon while "Add" 
            string CompanyCode = ddlCompany.SelectedValue.ToString();
            GridEditableItem item = (GridEditableItem)e.Item;

            //code to bind inside RadComboBox list   
            RadComboBox rcb = (RadComboBox)item.FindControl("ddlAccountCode");
            rcb.DataSource = GetAccCode(CompanyCode);
            rcb.DataTextField = "AccountDescription";
            rcb.DataValueField = "AccountCodeID";
            rcb.DataBind();
            rcb.Items.Insert(0, new RadComboBoxItem("- Select -", string.Empty));

            Session["AccCode"] = rcb.SelectedValue.ToString();
            string a = rcb.SelectedValue.ToString();

            //Select particular dropdown value while "Edit"
            Label lblAcCode2 = item.FindControl("lblAcCode2") as Label;
            if (!string.IsNullOrEmpty(lblAcCode2.Text))
            {
                rcb.SelectedValue = lblAcCode2.Text;
                rcb.SelectedItem.Text = lblAcCode2.Text;
            }
        }
    }
     //code to bind outside RadComboBox list
        protected void BindComapnyDL()
        {
            SqlConnection con = new SqlConnection(strcon);
            SqlCommand cmd = new SqlCommand("General.usp_tbl_BuyerCode_Query", con);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            try
            {
                con.Open();
                da.Fill(dt);
                con.Close();
            }
            catch (Exception ex)
            {
            }

            ddlCompany.DataTextField = "Title";
            ddlCompany.DataValueField = "Code";
            ddlCompany.DataSource = dt;
            ddlCompany.DataBind();

            Session["Comp"] = ddlCompany.SelectedValue.ToString();
            string a = ddlCompany.SelectedValue.ToString();      
        }

        //RadComboBox select index changed event
        protected void ddlCompany_SelectedIndexChanged(object sender, RadComboBoxSelectedIndexChangedEventArgs e)
        {
            if (ddlCompany.SelectedValue == null || ddlCompany.SelectedValue == "")
            {
                GridCommandItem cmditem = (GridCommandItem)RGGSTAcCode.MasterTableView.GetItems(GridItemType.CommandItem)[0];
                System.Web.UI.WebControls.Button ctrl = (System.Web.UI.WebControls.Button)cmditem.FindControl("AddNewRecordButton");
                ctrl.Enabled = false;

                System.Web.UI.WebControls.LinkButton btn = (System.Web.UI.WebControls.LinkButton)cmditem.FindControl("InitInsertButton");
                btn.Enabled = false;

                string content = "Please select company first";
                ScriptManager.RegisterStartupScript(this, typeof(string), "Successful", "alert('" + content + "');", true);
            }
            else
            {
                RGGSTAcCode.Rebind();
            }
        }

HTML-код

<telerik:RadComboBox ID="ddlCompany" runat="server" Height="200" Width="240"
          DropDownWidth="310" EmptyMessage="- Select Product -" HighlightTemplatedItems="true" CausesValidation="false"
          Filter="Contains" AppendDataBoundItems="true" AllowCustomText="true" AutoPostBack="true"
          DataTextField="Title" DataValueField="Code" OnSelectedIndexChanged="ddlCompany_SelectedIndexChanged">
        </telerik:RadComboBox>

<telerik:RadGrid ID="RGGSTAcCode" runat="server"
                   ShowFooter="True" GroupingEnabled="False" ShowStatusBar="true" EmptyDataText="No record available." 
                   AllowAutomaticInserts="False" AllowAutomaticUpdates="False" AllowAutomaticDeletes="true" 
                   OnNeedDataSource="RGGSTAcCode_NeedDataSource" OnItemDataBound="RGGSTAcCode_ItemDataBound" 
                   OnInsertCommand="RGGSTAcCode_InsertCommand" OnDeleteCommand="RGGSTAcCode_DeleteCommand" 
                   OnUpdateCommand="RGGSTAcCode_UpdateCommand" OnItemCommand="RGGSTAcCode_ItemCommand">
                  <mastertableview ShowHeadersWhenNoRecords="true" autogeneratecolumns="false" datakeynames="AccountCodeID" InsertItemDisplay="Top"
                    insertitempageindexaction="ShowItemOnCurrentPage" ShowFooter="True" CommandItemDisplay="Top" ClientIDMode="Static">                                   
                         <Columns> 
                             <telerik:GridEditCommandColumn ButtonType="ImageButton" UniqueName="EditCommandColumn"></telerik:GridEditCommandColumn> 

                             <telerik:GridTemplateColumn UniqueName="AccountCode" HeaderText="Account Code">
                                <ItemTemplate>
                                  <asp:Label ID="lblAcCode" runat="server" Text='<%# Eval("AccountCode")%>'></asp:Label>
                                </ItemTemplate>
                                <EditItemTemplate>
                                   <asp:Label ID="lblAcCode2" runat="server" Text='<%# Eval("AccountCode") + " - " + Eval("AccountDescription")%>' Visible="false"></asp:Label>

                                   <telerik:RadComboBox ID="ddlAccountCode" runat="server" Height="200" Width="240"
                                       DropDownWidth="310" HighlightTemplatedItems="true" CausesValidation="true"
                                       Filter="Contains" AppendDataBoundItems="true" DataTextField="AccountDescription" DataValueField="AccountCodeID">
                                   </telerik:RadComboBox>
                                </EditItemTemplate>
                             </telerik:GridTemplateColumn>

                             <telerik:GridBoundColumn DataField="AccountDescription" HeaderText="Description" UniqueName="AccountDescription" SortExpression="AccountDescription" InsertVisiblityMode="AlwaysHidden" ReadOnly="true" ></telerik:GridBoundColumn>
                             <telerik:GridBoundColumn aggregate="SUM" DataField="Amount" HeaderText="Amount" FooterAggregateFormatString="Total : {0:###,##0.00}" DataFormatString="{0:n}" FooterStyle-BackColor="#ffc04c" UniqueName="Amount" SortExpression="Amount"></telerik:GridBoundColumn>
                             <telerik:GridBoundColumn DataField="Remark" HeaderText="IFCA Remark" UniqueName="Remark" SortExpression="Remark">

                             </telerik:GridBoundColumn>    

                             <telerik:GridButtonColumn ConfirmTextFormatString="Are you sure you want to Delete {0} Account Code?" ConfirmTextFields="AccountCodeID"
                             ConfirmDialogType="RadWindow" CommandName="Delete" Text="Delete" UniqueName="DeleteColumn"></telerik:GridButtonColumn>                                                                            
                      </Columns>
                      <EditFormSettings>
                         <EditColumn ButtonType="ImageButton" />
                      </EditFormSettings>
                      <CommandItemSettings AddNewRecordText="Add new record" RefreshText="Refresh"></CommandItemSettings>
                  </mastertableview>
                </telerik:RadGrid> 

Пожалуйста, дайте мне знать, почему эта ошибка возникает для определенного элемента выбора RadComboBox.


person user3196511    schedule 07.08.2015    source источник
comment
Кто-нибудь, пожалуйста, помогите мне в этом вопросе. Я новичок в asp.net и не понимаю, как решить эту проблему в своем веб-приложении, поскольку столкнулся с этой проблемой для определенных данных. Любая помощь будет принята с благодарностью. ответьте, пожалуйста   -  person user3196511    schedule 10.08.2015
comment
За мои 2 цента я бы сказал, что используйте Ajax и методы ленивой загрузки для заполнения вашей сетки и полей со списком. 2000+ элементов — это много, чтобы загрузить все сразу, и к тому же это, вероятно, облагает налогом ваш сервер базы данных. См. пример здесь: demos.telerik.com/aspnet -ajax/сетка/примеры/производительность/   -  person Icemanind    schedule 10.08.2015
comment
Большое спасибо за ответ. Мне нужно заполнить/связать RadComboBox (comboRadGrid), который находится внутри RadGrid, на основе элементов, которые находятся за пределами RadGrid RadComboBox (comboOutside). Я прошел по предложенной вами ссылке, но не смог правильно понять. Я очень новичок в Telerik и asp.net. Пожалуйста, дайте мне знать, как изменить мой код привязки comboRadGrid (на основе внешних элементов списка Combo), чтобы эта проблема больше не возникала? ответьте, пожалуйста   -  person user3196511    schedule 10.08.2015
comment
Вместо полей со списком посмотрите эту ссылку: демонстрации. telerik.com/aspnet-ajax/combobox/examples/   -  person Icemanind    schedule 10.08.2015
comment
Спасибо за ответ. Пожалуйста, прочитайте мой опубликованный вопрос еще раз. Мне нужно привязать RadComboBox (который находится внутри RadGrid) на основе значений Item RadComboBox, который находится за пределами RadGrid. Я получаю эту ошибку только для тех записей, которые содержат большие данные для привязки внутри comboRadGrid. Если возможно, создайте пример кода для моего лучшего понимания в соответствии с моим опубликованным кодом. Ответьте, пожалуйста.   -  person user3196511    schedule 10.08.2015
comment
Я попытался перейти по этой ссылке: docs .telerik.com/devtools/aspnet-ajax/controls/grid/how-to/ Но теперь возникает другая ошибка: ошибка во время сериализации или десериализации с использованием json javascriptserializer. Длина строки должна превышать значение, установленное в параметре maxJSonLength Пожалуйста, ответьте. Помогите мне решить эту проблему   -  person user3196511    schedule 10.08.2015
comment
Вам нужно установить максимальный размер JSON. Посмотрите здесь: msdn.microsoft.com/en-us/library/   -  person Icemanind    schedule 10.08.2015
comment
Спасибо за ответ. Я попытался поместить этот код на страницу .aspx.cs public int MaxJsonLength { get; set; }, но по-прежнему получаю ту же ошибку. Пожалуйста, ответьте, что еще я должен изменить в своем коде.   -  person user3196511    schedule 11.08.2015
comment
Используется механизм LoadOnDemand по этой ссылке: demos.telerik.com/aspnet-ajax/combobox/examples/ . Этот подход используется для привязки большого количества записей в RadComboBox. И работает нормально. Спасибо @Icemanind за помощь   -  person user3196511    schedule 11.08.2015


Ответы (1)


Используется механизм LoadOnDemand по этой ссылке:
demos.telerik.com/aspnet-ajax/combobox/examples/…

Этот подход используется для большого количества записей для привязки в RadComboBox, что позволит избежать возникновения таких исключений. И работает нормально.
Спасибо @Icemanind за помощь.

person user3196511    schedule 11.08.2015