Obtenir la valeur d'un élément modifié dans un Telerik RadGrid

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;
}
}
}

J'ai un formulaire pour ajouter des éléments (non représentés), qui fonctionne très bien. Aussi le bouton Supprimer fonctionne très bien. Lorsque vous essayez de mettre à jour l'élément enregistré, toutes les valeurs que je peux obtenir de la GridDropDownColumn sont soit nulles, vides ou les valeurs par défaut, et non pas les valeurs modifiées. Lors de l'exécution pas à pas et à tester des choses dans la Fenêtre exécution dans Visual Studio, j'ai été en mesure de trouver la valeur correcte à l'aide de cette affirmation ridicule:

((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

Mais il y a un moyen plus facile. Ce que je fais mal?

  • Vous devriez être en mesure de récupérer vos données à partir de IItemDbItem w = (IItemDbItem)e.Item.DataItem;. var editValue = w.[SomeProperty]
  • Dans quel cas? Lorsque j'essaie dans la ItemDataBound, il a juste le précédent inédite valeurs.
  • dans l'événement de mise à jour, tout comme vous l'avez déjà dans votre code
  • J'ai essayé les deux ItemUpdated et UpdateCommand des événements, mais le ItemDataBound a déjà écrasé les valeurs par ce point.
InformationsquelleAutor travis | 2013-01-09