2010-02-03 3 views
1

Я использую детальное представление с sqldatasource на странице aspx. Я пытаюсь выполнить предварительную и пост-обработку некоторых полей - в основном для преобразования списка html в список, выделенный для новой строки для редактирования, и обратно в html для хранения в базе данных.Как изменить данные в событии данных DetailsView

Последующая обработка в ItemUpdating достаточно легко, но предварительная обработка в DataBound грязен ...

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); 
     } 
    } 
} 

Его хрупкость

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

что меня расстраивает. Я уверен, что у меня что-то отсутствует (более чем одно), очевидно!

Я предполагаю, что я надеялся сделать что-то еще, как мой ItemUpdating ...

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

ответ

0

Переключить на Asp.Net 4.0+ и использовать ObjectDataSource.

ObjectDataSource.TypeName объект передачи данных Type.FullName.
Комплект ObjectDataSource.DataObjectTypeName DTO Type.FullName.
Задайте ObjectDataSource.SelectMethod методу объекта доступа к данным, который получает IQueryable<MyDto>. Комплект DetailsView1.DataSourceID до ObjectDataSource.ID.
Комплект DetailsView1.ItemType DTO Type.FullName.

И делает Somthing так:

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);