Как я могу получить значения ячеек от Telerik RadGrid - PullRequest
1 голос
/ 20 апреля 2019

У меня проблема с получением значений из автоматически сгенерированной формы вставки Radgrid.

У меня есть мои настройки Radgrid, как показано в коде, показанном ниже. Я делаю только вставки и удаления и использую форму редактирования, которая автоматически открывается, когда я нажимаю кнопку добавления новой записи.

    <div id ="specialrequestGrid" class="container">
    <div class="row">
        <div class="col-md-12">
            <telerik:RadAjaxPanel runat="server">
                <telerik:RadGrid ID="SpecialRequests" runat="server" OnInsertCommand="SpecialRequests_InsertCommand"
                     OnUpdateCommand="SpecialRequests_UpdateCommand"
                     OnItemCommand="SpecialRequests_ItemCommand"
                     AllowAutomaticInserts="false"
                     AutoGenerateColumns="false"
                     OnNeedDataSource="SpecialRequests_NeedDataSource">
                    <MasterTableView CommandItemDisplay="Top" DataKeyNames="CaseId_FK, ReqId" Font-Size="Medium" NoMasterRecordsText="No Special Requests">
                        <CommandItemSettings AddNewRecordImageUrl="../Images/Add.png" />
                        <Columns>
                            <telerik:GridTemplateColumn HeaderText="Request Date" UniqueName="DateTemplateColumn">
                                <ItemTemplate>
                                        <asp:Label ID="DateEditItemTemplate" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Date","{0:MM/dd/yyyy}") %>'>
                                        </asp:Label>
                                    </ItemTemplate>
                                    <EditItemTemplate>
                                        <telerik:RadDatePicker ID="dpRideDate" runat="server" DateInput-DateFormat="MM/dd/yyyy" DbSelectedDate='<%# Bind("Date") %>' MinDate="1999/1/1" UniqueName="dpRideDate">
                                        </telerik:RadDatePicker>
                                    </EditItemTemplate>
                            </telerik:GridTemplateColumn>
                            <telerik:GridTemplateColumn HeaderText="Requested By ID" UniqueName="RequestorTemplateColumn">
                                <ItemTemplate>
                                        <asp:Label ID="Requestor" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "RequesterEID_FK") %>'>
                                        </asp:Label>
                                    </ItemTemplate>
                                    <EditItemTemplate>
                                        <button id="btnRequestEID" type="button" class="btn"  data-toggle="modal" data-target="#myModal" >--Please Select--</button>
                                        <div>
                                        <input type="text" Id="TxtSPRequestName" disabled  />
                                    </div>
                                    </EditItemTemplate>
                            </telerik:GridTemplateColumn>
                            <telerik:GridTemplateColumn HeaderText="Request Reason" UniqueName="RequestReason">
                                    <ItemTemplate>
                                        <asp:Label ID="ItemTemplatelblRequestReason" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Reason") %>'>
                                        </asp:Label>
                                    </ItemTemplate>
                                    <EditItemTemplate>
                                        <asp:Label ID="lblRequestReason" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Reason") %>' Visible="false">
                                        </asp:Label>
                                        <asp:TextBox runat="server" ID="txtReason" Text='<%# DataBinder.Eval(Container.DataItem, "Reason") %>'></asp:TextBox>
                                    </EditItemTemplate>
                                </telerik:GridTemplateColumn>
                            <telerik:GridCheckBoxColumn DataField="IsWOO" HeaderText="Is Out of Order" UniqueName="ISWOO"></telerik:GridCheckBoxColumn>
                        </Columns>
                    </MasterTableView>
                </telerik:RadGrid>

            </telerik:RadAjaxPanel>
        </div>
    </div>

</div>

Это скриншот автоматически сгенерированной формы, которую я получаю, когда нажимаю кнопку добавления новой записи

Telerik Generated Inset form

Когда я нажимаю ссылку Вставить в форме, я запускаю этот код C #

protected void SpecialRequests_InsertCommand(object sender, GridCommandEventArgs e)
    {

        GridEditableItem editedItem = e.Item as GridEditableItem;
        UserControl userControl = (UserControl)e.Item.FindControl(GridEditFormItem.EditFormUserControlID);

        T_SpecialRequests t = new T_SpecialRequests();
        t.IsWOO = (userControl.FindControl("IsWOO") as CheckBox).Checked;
    }

Обратите внимание, что IsWOO - это элемент управления в Radgrid, который я не показывал на снимке экрана. Когда я нажимаю ссылку сохранения, функция вставки, показанная выше, запускается, но я получаю следующую ошибку:

Необработанное исключение в строке 1, столбец 123034 в http://localhost:52028/bundles/MsAjaxJs?v=c42ygB2U07n37m_Sfa8ZbLGVu4Rr2gsBo7MvUEnJeZ81

0x800a139e - ошибка времени выполнения JavaScript: Sys.WebForms.PageRequestManagerServerErrorException: ссылка на объект не установлена ​​на экземпляр объекта.

Странная часть: я использую этот же код в нескольких других проектах без каких-либо проблем. Разница лишь в том, что я впервые использую эту автоматически сгенерированную форму. Я не хочу использовать другой тип управления для этой Radgrid из-за такого небольшого количества полей, только 4 элемента управления.

Я потратил несколько часов на поиск ответа, но просто не могу найти решение.

Как я могу получить значения из этой автоматически сгенерированной формы?

Ответы [ 2 ]

1 голос
/ 20 апреля 2019

Вы можете использовать

t.IsWOO = (editedItem["ISWOO"].Controls[0] as CheckBox).Checked; 

или

var newValues = new Dictionary<string, object>();
e.Item.OwnerTableView.ExtractValuesFromItem(newValues, editedItem);
t.IsWOO = (bool)newValues["IsWOO"];

Первый подход ссылается на элемент управления по индексу, потому что, к сожалению, у него нет идентификатора.

Второйнемного многословно только для одного свойства, но я бы, конечно, предпочел бы его, если бы было больше свойств.

0 голосов
/ 26 апреля 2019

Хотя @Michal Nawrocik был прав, я обнаружил, что у меня все еще есть некоторые проблемы при чтении всех элементов управления в Radgrid.Я смог отследить ответ на форуме Telerik и обнаружил, что вы должны использовать другой код в зависимости от типа столбца.У меня было 2 разных типа столбцов.

приведенный ниже код показывает, что я использовал для получения всех значений элемента управления в форме

protected void SpecialRequests_InsertCommand(object sender, GridCommandEventArgs e)
    {
        try
        {
         using(LatentEntities db = new LatentEntities())
            {
                if (e.Item is GridEditableItem)
                {
                    T_SpecialRequests T = new T_SpecialRequests();
                    var editableItem = ((GridEditableItem)e.Item);
                    RadDatePicker picker = (RadDatePicker)editableItem.FindControl("dpDate"); // in EditItem Template
                    DateTime dt = Convert.ToDateTime(picker.DbSelectedDate);
                    T.Date = dt;
                    TextBox Reason = (TextBox)editableItem.FindControl("txtReason"); //This Control was in an Edit Item Template
                    T.Reason = Reason.Text;
                    T.IsWOO = (editableItem["ISWOO"].Controls[0] as CheckBox).Checked; //In CheckBox Column 


                }
            }

И если элемент управления находится в Telerik: GridtboundColumnЯ использовал этот код:

string strFirstName = (editableItem["firstname"].Controls[0] as TextBox).Text;
...