Проблема с Telerik RadGrid: Telerik.Web.UI.GridInsertionObject не содержит свойства с именем «XXX». - PullRequest
1 голос
/ 01 сентября 2011

Последние пару часов я пытался найти способ решения следующей проблемы, но безуспешно.Я нашел много возможных решений в Интернете, но ни одно из них не было решением моей проблемы.Я также разместил этот же вопрос на официальном форуме Telerik, хотя почти уверен, что не получу от них ответа.

Проблема возникает, когда я хочу вставить данные в пустой источник данных.Я смог найти обходные пути для RadComboBoxes, но не для Textboxes.Отображаемая ошибка: «Привязка данных:« Telerik.Web.UI.GridInsertionObject »не содержит свойство с именем« OpciPrioritet »."

Вот код:

.ascx (необходимо для RadGrid):

<table>
<tr>
    <td>
        Nadređeni ticket:
    </td>
    <td colspan="3">
        <telerik:RadComboBox ID="rcbNadredeniTicket" AppendDataBoundItems="true" runat="server"
            Width="455px">
        </telerik:RadComboBox>
    </td>
</tr>
<tr>
    <td>
        Prijavio:
    </td>
    <td colspan="3">
        <telerik:RadComboBox ID="rcbPrijavio" AppendDataBoundItems="true" runat="server"
            Width="455px">
        </telerik:RadComboBox>
    </td>
</tr>
<tr>
    <td>
        Asset:
    </td>
    <td colspan="3">
        <telerik:RadComboBox ID="rcbAsset" AppendDataBoundItems="true" runat="server" Width="455px">
        </telerik:RadComboBox>
    </td>
</tr>
<tr>
    <td>
        Opći prioritet:
    </td>
    <td>
        <asp:TextBox ID="txtOpciPrioritet" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.OpciPrioritet") %>'></asp:TextBox>
    </td>
</tr>
<tr>
    <td>
        Tip:
    </td>
    <td>
        <telerik:RadComboBox ID="rcbTip" runat="server">
        </telerik:RadComboBox>
    </td>
</tr>
<tr>
    <td>
        Status:
    </td>
    <td>
        <telerik:RadComboBox ID="rcbStatus" runat="server">
        </telerik:RadComboBox>
    </td>
</tr>
<tr>
    <td>
        Datum prijave:
    </td>
    <td>
        <asp:TextBox ID="txtDatumPrijave" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.DatumPrijave") %>'></asp:TextBox>
    </td>
    <td>
        Vrsta prijave:
    </td>
    <td>
        <telerik:RadComboBox ID="rcbVrstaPrijave" Text='<%# DataBinder.Eval(Container, "DataItem.VrstaPrijave") %>'
            runat="server">
        </telerik:RadComboBox>
    </td>
</tr>
<tr>
    <td>
        Prioritet:
    </td>
    <td>
        <telerik:RadComboBox ID="rcbPrioritet" Text='<%# DataBinder.Eval(Container, "DataItem.Prioritet") %>'
            runat="server">
        </telerik:RadComboBox>
    </td>
    <td>
        Deadline:
    </td>
    <td>
        <asp:TextBox ID="txtDeadline" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.DatumDo") %>'></asp:TextBox>
    </td>
</tr>
<tr>
    <td>
        Opis:
    </td>
    <td colspan="3">
        <asp:TextBox ID="txtOpis" runat="server" TextMode="MultiLine" Width="455px" Height="200px"
            Text='<%# DataBinder.Eval(Container, "DataItem.Opis") %>'></asp:TextBox>
    </td>
</tr>
<tr>
    <td>
        Zatvoren ticket:
    </td>
    <td>
        <asp:CheckBox ID="chkZatvoren" runat="server" Checked='<%# CheckNull(DataBinder.Eval(Container, "DataItem.Zatvoren")) %>' />
    </td>
</tr>
<tr>
    <td>
        Opis zatvorenog ticketa:
    </td>
    <td colspan="3">
        <asp:TextBox ID="txtOpisZatvorenog" runat="server" TextMode="MultiLine" Width="455px"
            Height="200px" Text='<%# DataBinder.Eval(Container, "DataItem.OpisZatvoren") %>'></asp:TextBox>
    </td>
</tr>
<tr>
    <td>
        Bilješke:
    </td>
    <td colspan="3">
        <asp:TextBox ID="txtBiljeske" runat="server" TextMode="MultiLine" Width="455px" Height="200px"
            Text='<%# DataBinder.Eval(Container, "DataItem.Biljeske") %>'></asp:TextBox>
    </td>
</tr>
<tr>
    <td>
        <asp:Button ID="btnUpdate" Text="Spremi" runat="server" CommandName="Update" Visible='<%# !(DataItem is Telerik.Web.UI.GridInsertionObject) %>'>
        </asp:Button>
        <asp:Button ID="btnInsert" Text="Spremi" runat="server" CommandName="PerformInsert"
            Visible='<%# DataItem is Telerik.Web.UI.GridInsertionObject %>'></asp:Button>

        <asp:Button ID="btnCancel" Text="Odustani" runat="server" CausesValidation="False"
            CommandName="Cancel"></asp:Button>
    </td>
</tr>

.aspx.cs (только необходимый фрагмент кода):

        protected void gvTicketi_ItemDataBound(object sender, GridItemEventArgs e)
    {
        int idFirma = Convert.ToInt16(Request.QueryString["idt"]);

        if ((e.Item is GridEditFormItem) && e.Item.IsInEditMode )
        {
            GridEditFormItem editFormItem = (GridEditFormItem)e.Item;
            UserControl userControl = (UserControl)e.Item.FindControl(GridEditFormItem.EditFormUserControlID);

            TSEntities db = new TSEntities();
            Ticket ticket = new Ticket();
            TicketAsset ticketAsset = new TicketAsset();

            RadComboBox rcbTip = (RadComboBox)userControl.FindControl("rcbTip");
            rcbTip.Items.Add(new RadComboBoxItem("Incident"));
            rcbTip.Items.Add(new RadComboBoxItem("Reklamacija"));
            rcbTip.Items.Add(new RadComboBoxItem("Nova funkcionalnost"));
            rcbTip.DataBind();
            rcbTip.Text = "'<%# DataBinder.Eval(Container, 'DataItem.Tip') %>'";

            RadComboBox rcbStatus = (RadComboBox)userControl.FindControl("rcbStatus");
            rcbStatus.Items.Add(new RadComboBoxItem("New"));
            rcbStatus.Items.Add(new RadComboBoxItem("U radu"));
            rcbStatus.Items.Add(new RadComboBoxItem("On hold"));
            rcbStatus.Items.Add(new RadComboBoxItem("Pending"));
            rcbStatus.Items.Add(new RadComboBoxItem("Scheduled"));
            rcbStatus.Items.Add(new RadComboBoxItem("Canceled"));
            rcbStatus.Items.Add(new RadComboBoxItem("Completed"));
            rcbStatus.DataBind();
            rcbStatus.Text = "'<%# DataBinder.Eval(Container, 'DataItem.Status') %>'";

            RadComboBox rcbVrstaPrijave = (RadComboBox)userControl.FindControl("rcbVrstaPrijave");
            rcbVrstaPrijave.Items.Add(new RadComboBoxItem("Usmeno"));
            rcbVrstaPrijave.Items.Add(new RadComboBoxItem("Telefon"));
            rcbVrstaPrijave.Items.Add(new RadComboBoxItem("E-mail"));
            rcbVrstaPrijave.Items.Add(new RadComboBoxItem("Web"));
            rcbVrstaPrijave.DataBind();
            rcbVrstaPrijave.Text = "'<%# DataBinder.Eval(Container, 'DataItem.VrstaPrijave') %>'";

            RadComboBox rcbPrioritet = (RadComboBox)userControl.FindControl("rcbPrioritet");
            rcbPrioritet.Items.Add(new RadComboBoxItem("Low"));
            rcbPrioritet.Items.Add(new RadComboBoxItem("Normal"));
            rcbPrioritet.Items.Add(new RadComboBoxItem("High"));
            rcbPrioritet.Items.Add(new RadComboBoxItem("Odmah"));
            rcbPrioritet.DataBind();
            rcbPrioritet.Text = "'<%# DataBinder.Eval(Container, 'DataItem.Prioritet') %>'";

            RadComboBox rcbNadredeniTicket = (RadComboBox)userControl.FindControl("rcbNadredeniTicket");
            var nadredenTicketList = (from t in db.Ticket
                                        select t).ToList();

            if (nadredenTicketList.Count > 0)
            {
                rcbNadredeniTicket.DataSource = from t in nadredenTicketList
                                                where t.idFirma == idFirma && t.Zatvoren == false
                                                select new { t.idTicket, t.idNadredeniTicket, OpisTicketa = t.idTicket + " - " + t.Opis };

                rcbNadredeniTicket.DataTextField = "OpisTicketa";
                rcbNadredeniTicket.DataValueField = "idTicket";
                rcbNadredeniTicket.Text = "'<%# DataBinder.Eval(Container, 'DataItem.idNadredeniTicket') %>'";
            }

            rcbNadredeniTicket.Items.Add(new RadComboBoxItem("Bez nadređenog ticketa", "0"));
            rcbNadredeniTicket.DataBind();

            RadComboBox rcbPrijavio = (RadComboBox)userControl.FindControl("rcbPrijavio");
            rcbPrijavio.DataSource = from k in db.Kontakt
                                     where k.idFirma == idFirma
                                     select new { k.idKontakt, kontaktNaziv = k.Ime + " " + k.Prezime };

            rcbPrijavio.Items.Add(new RadComboBoxItem("Bez kontakta", "0"));
            rcbPrijavio.DataTextField = "kontaktNaziv";
            rcbPrijavio.DataValueField = "idKontakt";
            rcbPrijavio.Text = "'<%# DataBinder.Eval(Container, 'DataItem.idKontakt') %>'";
            rcbPrijavio.DataBind();

            RadComboBox rcbAsset = (RadComboBox)userControl.FindControl("rcbAsset");
            var assetList = (from a in db.Asset
                             where a.idFirma == idFirma
                             select a).ToList();

            if (assetList.Count > 0)
            {
                var assets = from a in assetList
                             where a.idFirma == idFirma
                             select new { a.idAsset, Naziv = a.Naziv + " (" + a.Kontakt.Ime + " " + a.Kontakt.Prezime + ")" };

                rcbAsset.DataSource = assets;
                rcbAsset.DataTextField = "Naziv";
                rcbAsset.DataValueField = "idAsset";
                rcbAsset.Text = "'<%# DataBinder.Eval(Container, 'DataItem.Naziv') %>'";
                rcbAsset.Items.Add(new RadComboBoxItem("Bez pridruženog asseta", "0"));
                rcbAsset.DataBind();
            }                             


            if (!e.Item.OwnerTableView.IsItemInserted)
            {
                int idTicket = Convert.ToInt32(editFormItem.GetDataKeyValue("idTicket"));
                ticket = db.Ticket.SingleOrDefault(t => t.idTicket == idTicket);

                string tip = ticket.Tip;
                rcbTip.Items.FindItemByText(tip).Selected = true;

                string status = ticket.Status;
                rcbStatus.Items.FindItemByText(status).Selected = true;

                string vrstaPrijave = ticket.VrstaPrijave;
                rcbVrstaPrijave.Items.FindItemByText(vrstaPrijave).Selected = true;

                string prioritet = ticket.Prioritet;
                rcbPrioritet.Items.FindItemByText(prioritet).Selected = true;

                int kontakt = Convert.ToInt32(ticket.idKontakt);

                if (ticket.idKontakt == null)
                {
                    rcbPrijavio.Items.FindItemByValue("0").Selected = true;
                }
                else
                {
                    rcbPrijavio.Items.FindItemByValue(kontakt.ToString()).Selected = true;
                }

                int nadredeniTicket = Convert.ToInt32(ticket.idNadredeniTicket);

                if (ticket.idNadredeniTicket == null)
                {
                    rcbNadredeniTicket.Items.FindItemByValue("0").Selected = true;
                }
                else
                {
                    rcbNadredeniTicket.Items.FindItemByValue(nadredeniTicket.ToString()).Selected = true;
                }

                var ticketAssetCount = from ta in db.TicketAsset
                                       where ta.idTicket == idTicket
                                       select ta;                  

                if (ticketAssetCount.Count() > 0)
                {
                    ticketAsset = db.TicketAsset.SingleOrDefault(ta => ta.idTicket == idTicket);

                    int asset = Convert.ToInt32(ticketAsset.idAsset);

                    rcbAsset.Items.FindItemByValue(asset.ToString()).Selected = true;
                }
                else
                {
                    rcbAsset.Items.FindItemByValue("0").Selected = true;
                }
            }
            else if (e.Item.OwnerTableView.IsItemInserted)
            {
                var newVals = new System.Collections.Specialized.ListDictionary();
                newVals["OpciPrioritet"] = string.Empty;
                e.Item.OwnerTableView.InsertItem(newVals);
            }
        }
    }

.aspx:

    <telerik:RadGrid ID="gvTicketi" runat="server" AllowPaging="True" AllowSorting="True"
    AutoGenerateColumns="False" CellSpacing="0" GridLines="None" 
    onneeddatasource="gvTicketi_NeedDataSource" 
    onitemdatabound="gvTicketi_ItemDataBound" 
    oninsertcommand="gvTicketi_InsertCommand" 
    onupdatecommand="gvTicketi_UpdateCommand">
    <MasterTableView DataKeyNames="idTicket" CommandItemDisplay="TopAndBottom" InsertItemPageIndexAction="ShowItemOnCurrentPage">
        <CommandItemSettings AddNewRecordText="Dodaj novi ticket" RefreshText="Prikaži sve tickete" />
        <Columns>
            <telerik:GridBoundColumn UniqueName="idTicket" HeaderText="Ticket" DataField="idTicket">
            </telerik:GridBoundColumn>
            <telerik:GridBoundColumn UniqueName="idKontakt" HeaderText="Kontakt" DataField="idKontakt">
            </telerik:GridBoundColumn>
            <telerik:GridBoundColumn UniqueName="idManager" HeaderText="Manager" DataField="idManager">
            </telerik:GridBoundColumn>
            <telerik:GridBoundColumn UniqueName="Opis" HeaderText="Opis" DataField="Opis">
            </telerik:GridBoundColumn>
            <telerik:GridBoundColumn UniqueName="TicketNumber" HeaderText="Broj ticketa" DataField="TicketNumber">
            </telerik:GridBoundColumn>
            <telerik:GridBoundColumn UniqueName="DatumPrijave" HeaderText="Datum prijave" DataField="DatumPrijave" DataFormatString="{0:dd.MM.yyyy.}">
            </telerik:GridBoundColumn>
            <telerik:GridBoundColumn UniqueName="VrstaPrijave" HeaderText="Vrsta prijave" DataField="VrstaPrijave">
            </telerik:GridBoundColumn>
            <telerik:GridBoundColumn UniqueName="Tip" HeaderText="Tip" DataField="Tip">
            </telerik:GridBoundColumn>
            <telerik:GridBoundColumn UniqueName="Status" HeaderText="Status" DataField="Status">
            </telerik:GridBoundColumn>
            <telerik:GridBoundColumn UniqueName="Prioritet" HeaderText="Prioritet" DataField="Prioritet">
            </telerik:GridBoundColumn>
            <telerik:GridBoundColumn UniqueName="OpciPrioritet" HeaderText="Opći prioritet" DataField="OpciPrioritet">
            </telerik:GridBoundColumn>
            <telerik:GridBoundColumn UniqueName="Deadline" HeaderText="Deadline" DataField="DatumDo" DataFormatString="{0:dd.MM.yyyy.}">
            </telerik:GridBoundColumn>
            <telerik:GridCheckBoxColumn UniqueName="Zatvoren" HeaderText="Zatvoren" DataField="Zatvoren">
            </telerik:GridCheckBoxColumn>
            <telerik:GridEditCommandColumn UniqueName="EditCommandColumn">
            </telerik:GridEditCommandColumn>
            <telerik:GridButtonColumn UniqueName="DeleteColumn" Text="Delete" CommandName="Delete"
                ConfirmDialogType="RadWindow" ConfirmText="Brisanje ticketa!" />
        </Columns>
        <EditFormSettings UserControlName="UserControls/TicketUserControl.ascx" EditFormType="WebUserControl">
            <EditColumn UniqueName="EditCommandColumn1">
            </EditColumn>
        </EditFormSettings>
    </MasterTableView>
</telerik:RadGrid>

Я очень надеюсь, что вы, ребята, сможете мне помочь, поэтому любая помощь будет оценена!

Ответы [ 4 ]

1 голос
/ 01 сентября 2011

Хорошо, я смог найти обходной путь. Что вам нужно сделать, это добавить событие ItemCommand.

protected void gvTicketi_ItemCommand(object sender, GridCommandEventArgs e)
    {
        if (e.CommandName == RadGrid.InitInsertCommandName)
        {
            e.Canceled = true;
            System.Collections.Specialized.ListDictionary newValues = new System.Collections.Specialized.ListDictionary();
            newValues["DatumPrijave"] = " ";
            newValues["DatumDo"] = " ";
            newValues["Opis"] = " ";
            newValues["OpisZatvoren"] = " ";
            newValues["Biljeske"] = " ";
            newValues["Zatvoren"] = false;
            newValues["Asset"] = "Bez pridruženog asseta";

            e.Item.OwnerTableView.InsertItem(newValues);
        }
    }
1 голос
/ 01 сентября 2011

Попробуйте добавить одно из следующего к привязке данных RadTextBox:

Первая попытка:

Text='<%# Eval("DataItem.OpciPrioritet") ?? String.Empty %>'

Вторая попытка:

Text='<%# Eval("DataItem.OpciPrioritet") != null ? Eval("DataItem.OpciPrioritet") : String.Empty %>'

Третья попытка:

Text='<%# Eval("DataItem.OpciPrioritet") != DBNull.Value ? Eval("DataItem.OpciPrioritet") : String.Empty %>'    
0 голосов
/ 23 июня 2016

Убедитесь, что ваш обработчик gvTicketi_NeedDataSource подключает вашу сетку до List<T>, а не IEnumerable<T>.Решил проблему для меня.

Источник: http://dotfresh.blogspot.com/2010/01/fixing-telerikwebuigridinsertionobject.html

0 голосов
/ 08 марта 2016

У меня была такая же проблема с GridDropDownColumn s внутри RadGrids, когда поле в объекте, подключенном к GridDropDownColumn, не обнуляется. Свойство DefaultInsertValue было для меня ключом. Я установил его на 0 для выпадающего списка с целыми числами в DataField.

<telerik:GridDropDownColumn DataField="SomeDataID" HeaderText="SomeData" 
    DataSourceID="SomeDataSource" ListValueField="ID" ListTextField="Name" 
    DefaultInsertValue="0">
</telerik:GridDropDownColumn>

Если ваш тип данных не обнуляемый, как у меня, я бы добавил проверку, используя тег ColumnValidationSettings в столбце, чтобы убедиться, что он заполнен, иначе вы, скорее всего, получите ошибку при отправке.

...