ASPX:
<telerik:RadGrid ID="ctlItemsGrid" runat="server" DataKeyNames="Id" AllowPaging="true" AllowSorting="true" GridLines="None" Skin="Windows7" EnableViewState="true">
<MasterTableView AutoGenerateColumns="false" AllowPaging="true" DataKeyNames="Id,WorkflowStatus" NoMasterRecordsText="No items exist in the database." EnableViewState="true">
<SortExpressions>
<telerik:GridSortExpression FieldName="Id" SortOrder="Descending" />
</SortExpressions>
<PagerStyle Mode="NextPrevAndNumeric" />
<Columns>
<telerik:GridNumericColumn ColumnEditorID="ctlColumnId" HeaderText="ID" DataField="Id" DecimalDigits="0" DataType="System.Int32" NumericType="Number" ReadOnly="true"></telerik:GridNumericColumn>
<telerik:GridDropDownColumn UniqueName="ctlColumnGridWorkflow" ColumnEditorID="ctlColumnWorkflow" HeaderText="Workflow" DataField="WorkflowStatus" DropDownControlType="DropDownList"></telerik:GridDropDownColumn>
<telerik:GridEditCommandColumn UniqueName="ctlColumnGridEdit" CancelText="Cancel" EditText="Edit"></telerik:GridEditCommandColumn>
<telerik:GridButtonColumn UniqueName="ctlColumnGridDelete" CommandName="Delete" CommandArgument="" Text="Remove"></telerik:GridButtonColumn>
</Columns>
</MasterTableView>
</telerik:RadGrid>
C#:
public partial class administration_modules_item_Default : ViewPageBase<IItemAdminPresenter, IItemAdminView>, IItemAdminView
{
private IEnumerable<WorkflowStatus> _workflowStatuses;
private IEnumerable<IItemDbItem> _items;
protected override void PreloadView()
{
this.ctlItemsGrid.ItemDataBound += new Telerik.Web.UI.GridItemEventHandler(ctlItemsGrid_ItemDataBound);
this.ctlItemsGrid.ItemCommand += new GridCommandEventHandler(ctlItemsGrid_ItemCommand);
//this.ctlItemsGrid.ItemUpdated += new GridUpdatedEventHandler(ctlItemsGrid_ItemUpdated);
this.ctlItemsGrid.UpdateCommand += new GridCommandEventHandler(ctlItemsGrid_UpdateCommand);
}
protected override void PostLoadView()
{
// Doesn't work, values are all empty strings
//foreach (GridEditableItem editItem in ctlItemsGrid.EditItems)
//{
// Dictionary<string, string> newValues = new Dictionary<string, string>();
// ctlItemsGrid.MasterTableView.ExtractValuesFromItem(newValues, editItem);
// IItemDbItem w = (IItemDbItem)editItem.DataItem;
// if (!string.IsNullOrWhiteSpace(newValues["WorkflowStatus"]))
// {
// w.WorkflowStatus = (WorkflowStatus)Enum.Parse(typeof(WorkflowStatus), newValues["WorkflowStatus"]);
// this.Presenter.Update(w.Id, w.WorkflowStatus);
// }
//}
ctlItemsGrid.DataSource = _items;
ctlItemsGrid.DataBind();
base.PostLoadView();
}
void ctlItemsGrid_ItemDataBound(object sender, Telerik.Web.UI.GridItemEventArgs e)
{
if (e.Item is GridEditableItem && (e.Item as GridEditableItem).IsInEditMode)
{
GridEditableItem editedItem = e.Item as GridEditableItem;
GridEditManager editMan = editedItem.EditManager;
IItemDbItem w = (IItemDbItem)e.Item.DataItem;
// This doesn't work either, values are all null or empty:
//if (editedItem.CanExtractValues)
//{
// Dictionary<string, string> newValues = new Dictionary<string,string>();
// editedItem.ExtractValues(newValues);
// if (newValues["WorkflowStatus"] != null)
// {
// w.WorkflowStatus = (WorkflowStatus)Enum.Parse(typeof(WorkflowStatus), newValues["WorkflowStatus"]);
// this.Presenter.Update(w.Id, w.WorkflowStatus);
// }
//}
GridDropDownListColumnEditor ctlColumnWorkflow = editMan.GetColumnEditor("ctlColumnGridWorkflow") as GridDropDownListColumnEditor;
ctlColumnWorkflow.DataSource = _workflowStatuses;
ctlColumnWorkflow.DataBind();
ctlColumnWorkflow.SelectedValue = w.WorkflowStatus.ToString();
}
else if (e.Item is GridDataItem)
{
GridDataItem dataItem = e.Item as GridDataItem;
IItemDbItem w = (IItemDbItem)e.Item.DataItem;
dataItem["ctlColumnGridWorkflow"].Text = w.WorkflowStatus.ToString();
}
}
void ctlItemsGrid_ItemCommand(object sender, GridCommandEventArgs e)
{
string cmdName = e.CommandName;
IItemDbItem w = (IItemDbItem)e.Item.DataItem;
switch (cmdName)
{
case "Delete":
this.Presenter.Delete(w.Id);
this.Presenter.LoadView();
break;
case "Update":
// This doesn't work either:
//GridEditableItem editedItem = e.Item as GridEditableItem;
//GridEditManager editMan = editedItem.EditManager;
//DropDownList editWorkflow = (DropDownList)editedItem["ctlColumnGridWorkflow"].Controls[0];
//DropDownList editEvent = (DropDownList)editedItem["ctlColumnGridEvent"].Controls[0];
//this.Presenter.Update(w.Id, (WorkflowStatus)Enum.Parse(typeof(WorkflowStatus));
break;
}
//this.Presenter.LoadView();
}
// Doesn't work:
//void ctlItemsGrid_ItemUpdated(object sender, GridUpdatedEventArgs e)
//{
// GridEditableItem editedItem = e.Item as GridEditableItem;
// GridEditManager editMan = editedItem.EditManager;
// DropDownList editWorkflow = editedItem["ctlColumnGridWorkflow"].Controls[0] as DropDownList;
// IItemDbItem w = (IItemDbItem)e.Item.DataItem;
// this.Presenter.Update(w.Id, (WorkflowStatus)Enum.Parse(typeof(WorkflowStatus), editWorkflow.SelectedValue));
//}
// Doesn't work:
void ctlItemsGrid_UpdateCommand(object sender, GridCommandEventArgs e)
{
GridEditableItem editedItem = e.Item as GridEditableItem;
GridEditManager editMan = editedItem.EditManager;
DropDownList editWorkflow = editedItem["ctlColumnGridWorkflow"].Controls[0] as DropDownList;
IItemDbItem w = (IItemDbItem)e.Item.DataItem;
this.Presenter.Update(w.Id, (WorkflowStatus)Enum.Parse(typeof(WorkflowStatus), editWorkflow.SelectedValue));
}
public IEnumerable<WorkflowStatus> WorkflowStatuses
{
set
{
_workflowStatuses = value;
}
}
public IEnumerable<IItemDbItem> Items
{
get
{
return _items;
}
set
{
_items = value;
}
}
}
我有一个单独的表单来添加项目(未显示),效果很好。删除按钮也可以正常工作。尝试更新保存的项目时,我可以从 GridDropDownColumn 获取的所有值都是空值、空值或默认值,而不是编辑后的值。在 Visual Studio 的即时窗口中单步执行和测试内容时,我能够使用这个荒谬的语句找到正确的值:
((DropDownList)ctlItemsGrid.MasterTableView.GetItems(GridItemType.EditFormItem)[0].Controls[1].Controls[0].Controls[0].Controls[1].Controls[0].Controls[0].Controls[1].Controls[1].Controls[0]).SelectedValue
但必须有一个更简单的方法。我究竟做错了什么?