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
etUpdateCommand
des événements, mais leItemDataBound
a déjà écrasé les valeurs par ce point.
Vous devez vous connecter pour publier un commentaire.
Étrange que la mise en œuvre initiale n'a pas de travail, j'ai fait cuire un rapide exemple de projet sur ma fin, et a réussi à obtenir l'ensemble des informations à partir de l'e.De l'élément.DataItem (quoique seulement la colonne Id, puisque nous sommes de la liaison à la DropDownList plus tard).
Est là une exigence stricte sur l'accaparement des ce à partir de l'événement ItemDataBound? Une meilleure événement serait l'UpdateCommand. Vous pouvez facilement obtenir de l'élément à l'aide de certains rapide code:
Alors vous pouvez extraire souhaitée valeurs à l'aide des techniques décrites dans cette documentation article.
Si vous avez encore envie de l'aborder, comme dans votre première tentative autonome exemple de projet peut être afin de voir exactement ce qui se passe.
Je ne suis pas sûr si c'était la bonne façon de régler le problème, mais cela fonctionne pour moi:
À l'aide de la
NeedDataSource
etRebind
semblait laisser leItemCommand
commencer à fonctionner comme prévu.