2009-03-04 6 views
3

Je suis en train de modifier le modèle de page par défaut "Edit.aspx" utilisé par ASP.NET Dynamic Data et d'ajouter des contrôles supplémentaires. Je sais que je peux trouver le type d'objet en cours d'édition en regardant DetailsDataSource.GetTable().EntityType, mais comment puis-je voir l'objet lui-même? Puis-je également modifier les propriétés de l'objet et indiquer au contexte de données de soumettre ces modifications?Accès à l'objet/ligne en cours de modification dans Dynamic Data

+0

Quand est-ce que vous essayez d'accéder à l'objet actuel? – RSolberg

+0

Y a-t-il un événement DataBound que vous pouvez utiliser? – hunter

Répondre

1

Peut-être avez-vous déjà trouvé une solution, mais j'aimerais partager mon opinion là-dessus.

Il s'est avéré être un bon pita, mais j'ai réussi à obtenir la ligne d'édition. J'ai dû extraire le DetailsDataSource WhereParameters, puis créer une requête en cours d'exécution.

Le code ci-dessous fonctionne pour les tables avec une seule clé primaire. Si vous avez des clés composées, je suppose, il faudra modifications:

Parameter param = null; 
foreach(object item in (DetailsDataSource.WhereParameters[0] as DynamicQueryStringParameter).GetWhereParameters(DetailsDataSource)) { 
    param = (Parameter)item; 
    break; 
} 

IQueryable query = DetailsDataSource.GetTable().GetQuery(); 
ParameterExpression lambdaArgument = Expression.Parameter(query.ElementType, ""); 
object paramValue = Convert.ChangeType(param.DefaultValue, param.Type); 
Expression compareExpr = Expression.Equal(
    Expression.Property(lambdaArgument, param.Name), 
    Expression.Constant(paramValue) 
); 
Expression lambda = Expression.Lambda(compareExpr, lambdaArgument); 
Expression filteredQuery = Expression.Call(typeof(Queryable), "Where", new Type[] { query.ElementType }, query.Expression, lambda); 
var WANTED = query.Provider.CreateQuery(filteredQuery).Cast<object>().FirstOrDefault<object>(); 
0

Si c'est un objet DD vous pourrez peut-être utiliser FieldTemplateUserControl.FindFieldTemplate (ControlId). Ensuite, si vous en avez besoin, vous pouvez le transformer en ITextControl pour manipuler des données.

Sinon, essayez d'utiliser cette méthode d'extension pour trouver le contrôle enfant:

public static T FindControl<T>(this Control startingControl, string id) where T : Control 
    { 
     T found = startingControl.FindControl(id) as T; 

     if (found == null) 
     { 
      found = FindChildControl<T>(startingControl, id); 
     } 

     return found; 
    } 
0

J'ai trouvé une autre solution, les autres ne fonctionnent pas.
Dans mon cas, j'ai copié Edit.aspx dans/CustomPages/Devices/
Périphériques est le nom de la table pour laquelle je veux ce comportement personnalisé.

Ajouter ce dans Edit.aspx -> Page_Init()

DetailsDataSource.Selected += entityDataSource_Selected; 

Ajouter ceci dans Edit.aspx:

protected void entityDataSource_Selected(object sender, EntityDataSourceSelectedEventArgs e) 
{ 
    Device device = e.Results.Cast<Device>().First();  
    // you have the object/row being edited ! 
} 

changer simplement l'appareil à votre propre nom de table.

Questions connexes