2010-02-03 4 views
1

J'utilise une vue détaillée avec un sqldatasource dans la page ASPX. J'essaye de faire du pré et du post-traitement sur certains des champs - essentiellement pour convertir une liste html en une liste séparée par une nouvelle ligne pour éditer et revenir en html pour stocker dans la base de données.comment modifier les données dans un événement DetailsView Databound

Le post-traitement dans ItemUpdating est assez facile, mais le prétraitement dans DataBound est en désordre ...

protected void DetailsView1_DataBound(object sender, EventArgs e) 
{ 
    if (DetailsView1.Rows.Count > 2) 
    { 
     string s =((DataRowView)DetailsView1.DataItem).Row.ItemArray[2].ToString(); 


     TextBox box1 = (TextBox) DetailsView1.FindControl("textbox1"); 
     if (box1 != null) 
     { 
      box1.Text = preprocess(s); 
     } 
    } 
} 

Sa fragilité de la

string s=((DataRowView)DetailsView1.DataItem).Row.ItemArray[2].ToString();

qui me bouscule. Je suis sûr qu'il me manque quelque chose (plus d'une chose) évidente!

Je suppose que j'espérais faire quelque chose comme mon ItemUpdating ...

e.NewValues["threeline"] = postprocess(e.NewValues["threeline"].ToString());

Répondre

0

Passer au Asp.Net 4.0+ et utiliser ObjectDataSource.

Définissez ObjectDataSource.TypeName sur l'objet d'accès aux données Type.FullName.
Définissez ObjectDataSource.DataObjectTypeName sur le DTO Type.FullName.
Définissez ObjectDataSource.SelectMethod sur la méthode d'objet d'accès aux données qui obtient un IQueryable<MyDto>. Définissez DetailsView1.DataSourceID à ObjectDataSource.ID.
Définissez DetailsView1.ItemType sur le DTO Type.FullName.

Et ne somthing comme ceci:

var item = DetailsView1.DataItem as MyDTO; 
if(item == null) 
    return; 

var box1 = (TextBox) DetailsView1.FindControl("textbox1"); 
if (box1 == null) 
    return; 

box1.Text = preprocess(item.PropertyName); 
Questions connexes