无法在 Telerik RadGrid 中关闭编辑表单

Not able to close Edit Form in Telerik RadGrid

我正在尝试使用 ItemCommand 事件在 RadGrid 中插入新项目。但此后无法关闭编辑表单。

这是我的 aspx 中的代码-

<telerik:RadGrid ID="rgItems" Skin="Metro" runat="server" AutoGenerateColumns="false" Width="100%"
    AllowAutomaticInserts="true"
    MasterTableView-CommandItemSettings-ShowRefreshButton="false"
    OnNeedDataSource="rgItems_NeedDataSource" OnItemCommand="rgItems_ItemCommand">

    <MasterTableView CommandItemDisplay="Top" AllowAutomaticInserts="true" CommandItemSettings-ShowAddNewRecordButton="true">
        <EditFormSettings EditFormType="Template">
            <FormTemplate>
                <asp:Panel ID="pnlNewItem" runat="server" DefaultButton="btnInsert">
                    <div class="form-group">
                            <asp:TextBox ID="txtClass" runat="server" CssClass="form-control" placeholder="Enter Class" Text='<%# Eval("Class") %>'></asp:TextBox>
                    </div>
                    <div class="form-group">
                            <asp:TextBox ID="txtWeight" runat="server" CssClass="form-control" placeholder="Enter Weight" Text='<%# Eval("Weight") %>'></asp:TextBox>
                    </div>

                    <div class="box-footer">
                        <asp:Button ID="btnCancel" runat="server" Text="Cancel" class="btn btn-default" CommandName="Cancel" />
                        <asp:Button ID="btnInsert" runat="server" class="btn btn-info pull-right"
                            CommandName='<%# (Container is GridEditFormInsertItem) ? "PerformInsert" : "Update" %>'
                            Text='<%# (Container is GridEditFormInsertItem) ? "Add Item" : "Update" %>' />
                    </div>
                </asp:Panel>
            </FormTemplate>
        </EditFormSettings>
        <Columns>
            <telerik:GridTemplateColumn HeaderText="Class">
                <ItemTemplate>
                    <asp:Label ID="lblClass" runat="server" placeholder="Enter Class" Text='<%# Eval("Class") %>'></asp:Label>
                </ItemTemplate>
            </telerik:GridTemplateColumn>
            <telerik:GridTemplateColumn HeaderText="Weight">
                <ItemTemplate>
                    <asp:Label ID="lblWeight" runat="server" placeholder="Enter Weight" Text='<%# Eval("Weight") %>'></asp:Label>
                </ItemTemplate>
            </telerik:GridTemplateColumn>
        </Columns>
    </MasterTableView>
</telerik:RadGrid>

这是 ItemCommand 事件中的代码-

protected void rgItems_ItemCommand(object sender, Telerik.Web.UI.GridCommandEventArgs e)
{

        DataTable dtItems_Global = new DataTable();
        dtItems_Global.Columns.Add(new DataColumn("Class", typeof(string)));
        dtItems_Global.Columns.Add(new DataColumn("Weight", typeof(string)));

        if (rgItems.Items.Count > 0)
        {
            foreach (GridDataItem gdi in rgItems.Items)
            {
                DataRow drItem = dtItems_Global.NewRow();
                drItem["Class"] = (gdi.FindControl("lblClass") as Label).Text;
                drItem["Weight"] = (gdi.FindControl("lblWeight") as Label).Text;

                dtItems_Global.Rows.Add(drItem);
            }
        }
    switch (e.CommandName)
    {
        case "PerformInsert":
            TextBox txtItemClass = (e.Item.FindControl("txtClass") as TextBox);
            TextBox txtItemWeight = (e.Item.FindControl("txtWeight") as TextBox);

            DataRow drItem = dtItems_Global.NewRow();
            drItem["Class"] = txtItemClass.Text;
            drItem["Weight"] = txtItemWeight.Text;
            dtItems_Global.Rows.Add(drItem);

            rgItems.Rebind();
            break;
    }
}

您能否在 RadGrid 的列标记中包含一个空的编辑列,如下所示?那是不见了。

<telerik:GridEditCommandColumn>
</telerik:GridEditCommandColumn>

此外,添加上述标记后,ItemCommand 的 code-behind 还应包含以下代码。

protected void rgItems_ItemCommand(object source, GridCommandEventArgs e)
    {
        if (e.CommandName == RadGrid.InitInsertCommandName) //"Add Item" button clicked
        {
            GridEditCommandColumn editColumn = (GridEditCommandColumn)rgItems.MasterTableView.GetColumn("EditCommandColumn");
            editColumn.Visible = false;
        }
        else if (e.CommandName == RadGrid.RebindGridCommandName && e.Item.OwnerTableView.IsItemInserted)
        {
            e.Canceled = true;
        }
        else
        {
            GridEditCommandColumn editColumn = (GridEditCommandColumn)rgItems.MasterTableView.GetColumn("EditCommandColumn");
            if (!editColumn.Visible)
                editColumn.Visible = true;
        }
    }

如果上面没有解决它,那么在ItemInserted事件中使用下面代码的简单方法。

e.KeepInInsertMode = false; 
rgItems.EditIndexes.Clear(); 
rgItems.Rebind(); 

我想推荐分别使用 OnInsertCommand、OnUpdateCommand 和 OnDeleteCommand。

它比每个命令都使用 switch 语句要干净得多。

<telerik:RadGrid ID="rgItems" 
   ... 
   OnItemCommand="REMOVE THIS EVENT"
   OnInsertCommand="rgItems_InsertCommand"
   OnUpdateCommand="rgItems_UpdateCommand"           
   OnDeleteCommand="rgItems_DeleteCommand">
   <MasterTableView CommandItemDisplay="Top" DataKeyNames="Id"> 
     Make sure Id is the unique Id in your database - normally primary key.
</telerik:RadGrid>

protected void rgItems_InsertCommand(object source, GridCommandEventArgs e)
{
   var item = e.Item as GridEditFormItem;
   var txtClass= item.FindControl("txtClass") as TextBox;
   // Insert to database - Do not need to call rgItems.Rebind(); here.
}

protected void rgItems_UpdateCommand(object source, GridCommandEventArgs e)
{
   var item = e.Item as GridEditFormItem;    
   int id = Convert.ToInt32(e.Item.OwnerTableView.DataKeyValues[e.Item.ItemIndex]["Id"]);   
   var txtClass= item.FindControl("txtClass") as TextBox;    
   // Update - Do not need to call rgItems.Rebind(); here.
}

protected void rgItems_DeleteCommand(object source, GridCommandEventArgs e)
{
   int id = Convert.ToInt32(e.Item.OwnerTableView.DataKeyValues[e.Item.ItemIndex]["Id"]);     
   // Delete - Do not need to call rgItems.Rebind(); here.
}