Ich ändere die von ASP.NET Dynamic Data verwendete Standardvorlage "Edit.aspx" und fügt einige zusätzliche Steuerelemente hinzu. Ich weiß, dass ich den Typ des bearbeiteten Objekts finden kann, indem ich DetailsDataSource.GetTable().EntityType
betrachte, aber wie kann ich das eigentliche Objekt selbst sehen? Kann ich auch die Eigenschaften des Objekts ändern und dem Datenkontext mitteilen, dass diese Änderungen gesendet werden sollen?Zugriff auf das Objekt/die Zeile, die in Dynamischen Daten bearbeitet wird
Antwort
Vielleicht haben Sie schon eine Lösung gefunden, aber ich würde gerne meine Meinung dazu teilen.
Es stellte sich heraus, dass es eine großartige Pita war, aber ich habe es geschafft, die Bearbeitungsreihe zu bekommen. Ich musste die DetailsDataSource WhereParameters extrahieren und dann eine Abfrage in Runtime erstellen.
Der folgende Code funktioniert für Tabellen mit einem einzelnen Primärschlüssel. Wenn Sie Verbindung Schlüssel haben, glaube ich, wird es Änderungen erfordern:
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>();
Wenn es ein DD-Objekt ist möglicherweise Sie in der Lage sein verwenden FieldTemplateUserControl.FindFieldTemplate (Control-ID). Wenn Sie es dann benötigen, können Sie es als ITextControl zur Manipulation von Daten verwenden.
Ansonsten versuchen, diese Erweiterungsmethode mit dem Kind Kontrolle zu finden:
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;
}
ich eine andere Lösung gefunden, haben die anderen nicht funktioniert.
In meinem Fall habe ich Edit.aspx in kopiert/CustomPages/Devices/
Wo Devices ist der Name der Tabelle, für die ich dieses benutzerdefinierte Verhalten möchte.
Fügen Sie diese in Edit.aspx -> Page_Init()
DetailsDataSource.Selected += entityDataSource_Selected;
Fügen Sie diese in Edit.aspx:
protected void entityDataSource_Selected(object sender, EntityDataSourceSelectedEventArgs e)
{
Device device = e.Results.Cast<Device>().First();
// you have the object/row being edited !
}
Nur Gerät zu Ihrer eigenen Tabellennamen ändern.
Wann versuchen Sie, auf das tatsächliche Objekt zuzugreifen? – RSolberg
Gibt es ein DataBound-Ereignis, das Sie verwenden können? – hunter