无法在 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.
}
我正在尝试使用 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.
}