Bind a proprietà di una classe interna

mercoledì 19 dicembre 2007 - 10.28

chavez Profilo | Newbie

Ciao a tutti,

ho una FormView collegata ad un ObjectDataSource che fornisce degli oggetti di classe C1 (nome fittizio). La classe C1 ha come membro una classe C2:

class C1
{
.......
C2 _innerClass;

public C2 InnerObject
{
get { return _innerClass; }
.......
}
}

class C2
{
public int _i1;
......

public int I
{
get { return _i1; }
set { _i1 = value; }
}
}

C1 objectC1;

Nella mia formview vorrei "bindare" una textbox al valore della variabile membro objectC1.InnerObject.i1 o a una proprietà che ritorna la variabile i1.

Ho provato con un <%# Bind("objectC1.InnerObject.I") %> ma ottengo un errore.
Sto sbagliando qualcosa di concettuale?

Grazie dell'aiuto.
Ciao a tutti.
Federico

freeteo Profilo | Guru

ciao,
sembra quasi ci sia un problema di sintassi, ti posto un esempio giusto, confrontalo con il tuo codice:
protected void Page_Load(object sender, EventArgs e) { Cliente cliente = new Cliente(); cliente.Descrizione = "io"; cliente.Codice = "1"; Ordine ordine = new Ordine(); ordine.Data = DateTime.Now; ordine.Numero = 1; ordine.Cliente = cliente; miaFormView.DataSource = new Ordine[] { ordine } ; DataBind(); }
dove nell'esempio ho una classe "Ordine" che ha oltre alle sue proprieta' dritte, ha una proprieta' complessa "Cliente" che è un'altra classe (analogo a quello che hai segnalato tu) e per la parte asp.net:
<asp:FormView runat="server" id="miaFormView"> <ItemTemplate> <div>numero: <%# Eval("numero") %></div> <div>data: <%# Eval("data") %></div> <div>cliente: <%# Eval("cliente.descrizione") %></div> </ItemTemplate> </asp:FormView>

come vedi nella formview prendo la "descrizione" della proprieta' complessa cliente.

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

chavez Profilo | Newbie

Ciao,

ti ringrazio per la risposta.
Quello che tu dici funziona solo nel caso in cui tu utilizzi l'EVAL(), ovvero un one-way binding.
Nel mio caso vorrei utilizzare il two-way binding.
Utilizzando la bind() con la notazione che mi hai suggerito, il compilatore mi genera un errore:
"A call to Bind was not well formatted. Please refer to documentation for the correct parameters to Bind."

Questa mi sembra un forte limitazione al comunque utile sistema di bind dichiarativo di ASP.NET 2.0.

Ciao
Federico

freeteo Profilo | Guru

ciao,
effettivamente il twoway non è supportato, ed è una cosa che ho riscontrato purtroppo anche nella parte Win32 del framework, soprattutto per quanto riguarda le GridView, percui mi sono dovuto fare delle colonne mie che gestivano queste funzionalita'.
Cmq sia, per quello che stiamo analizzando in questo thread, la cosa è risolvibile facendo una proprieta "calcolata", di profondita' 1, quindi "piatta" diciamo, che poi vada ad assegnare il valore alla classe interna.
Questa proprieta' è tale e quale ad una classica, solo che dentro alla proprieta' viene fatta l'operazione che ti interessa, tradotto in codice:
... private Cliente cliente; public Cliente Cliente { get { return cliente; } set { cliente = value; } } public string ClienteDescrizione { get { if(cliente != null) return cliente.Descrizione; else return null; } set { if(cliente != null) cliente.Descrizione = value; } } ...
Come vedi, esponi una proprieta' della classe "ClienteDescrizione" che in realta' punta alla proprieta' "Descrizione" dell'oggetto "Cliente" che ha all'interno.
Questa cosa è scomoda se hai tante proprieta' da esporre, ma al momento non ho altre soluzioni applicabili...

buone feste.

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

chavez Profilo | Newbie

Ciao,

ti ringrazio della risposta.
Anche io avevo intrapreso questa strada per risolvere il problema. Speravo che ci fosse una soluzione più elegante ma mi accontenterò di questa.

Grazie ancora
ciao
Federico
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5