2010-02-06 3 views
2

프로그래밍 방식으로 템플릿 필드를 추가하는 GridView가 있습니다. 각 템플릿 필드에는 텍스트 상자가 있습니다. 이 텍스트 상자에 데이터베이스 열에 대한 양방향 바인딩을 만들고 싶습니다. 아래 코드를 참조하십시오.프로그래밍 방식으로 템플릿 필드에 텍스트 상자를 양방향 바인딩하는 방법

public class CustomEditItemTemplate : ITemplate 
{ 
private DataControlRowType templateType; 
private string columnName; 

public CustomEditItemTemplate(DataControlRowType type, string colname) 
{ 
    this.templateType = type; 
    this.columnName = colname; 
} 

public void InstantiateIn(System.Web.UI.Control container) 
{ 
TextBox tb = new TextBox(); 
tb.ID = columnName; 
tb.DataBinding += new EventHandler(this.tb_DataBinding); 
container.Controls.Add(tb); 
} 

private void tb_DataBinding(Object sender, EventArgs e) 
{ 
    TextBox t = (TextBox)sender; 
    DetailsView dv = (DetailsView)t.NamingContainer; 

    //This line does only one way binding. It takes the rows from the database and displays 
    //them in the textboxes. The other way binding is not done. This is why my code fails 
    t.Text = DataBinder.Eval(dv.DataItem, columnName).ToString();   
} 

} 내가 텍스트를 편집 할 때, 이러한 변경이 데이터베이스에 반영하는 텍스트 상자는 할 수있는 방법

tf = new TemplateField(); 
tf.HeaderText = "My First Names"; 
tf.EditItemTemplate = new CustomEditItemTemplate(DataControlRowType.DataRow, "firstName"); 
dvModify.Fields.Add(tf); 

을 다음과 같이 내가 위의 클래스를 호출하고있어

게다가? 당신의 시간 모두

답변

0

에 대한

덕분에 아마 당신은 t.Text= string.Format("<%# Bind(\"{0}\") %>", columnName); 같은 뭔가를 줄 t.Text = DataBinder.Eval(dv.DataItem, columnName).ToString();을 변경할 수 있을까?

Article at CodeProject circa 2005

Article at Programmer's Heaven

: 문제가 해결되지 않으면

이 그냥 추측입니다 ...

는 사실은 두 가지 방법으로 데이터 바인딩을 처리하기위한 새로운 클래스를 작성 몇 가지 기사를 발견

이 옵션 중 하나가 유용 할 것입니다.

0

물론 템플릿 필드를 프로그래밍 방식으로 처리하는 것은 그리 좋지 않습니다. 방법은 다음과 같습니다. 요약 :

TemplateField tf = new TemplateField(); 
//Do some config like headertext, style, etc; 

tf.ItemTemplate = new CompiledTemplateBuilder(delegate(Control container) 
{ 
    //Add the regular row here, probably use a Label or Literal to show content 
    Label label = new Label(); 
    lable.DataBinding += delegate(object sender, EventArgs e) 
    { 
     label.Text = ((MyDataType)DataBinder.GetDataItem(label.BindingContainer)).MyLabelDataField; 
    }; 
}); 

tf.EditItemTemplate = new CompiledBindableTemplateBuilder(delegate(Control container) 
{ 
    //Here we do the edit row. A CompiledBindableTemplateBuilder lets us bind in both directions 
    TextBox text = new TextBox(); 
    text.DataBound += delegate(object sender, EventArgs e) 
    { 
     text.Text = ((MyDataType)DataBinder.GetDataItem(text.BindingContainer)).MyLabelDataField; 
    } 
}, 
delegate(Control container) 
{ 
    OrderedDictionary dict = new OrderedDictionary(); 
    dict["myLabelDataColumn"] = ((TextBox)container.FindControl(text.ID)).Text; 
    return dict; 
}); 

여기에 있습니다. CompiledBindableTemplateBuilder 및 CompiledTemplateBuilder를 사용하여 템플릿 필드의 내용을 실제로 빌드합니다. 델리게이트를 사용하는 것은 이것을 설정하는 쉬운 방법 일뿐입니다.

질문에 답하는 열쇠는 바인딩을 설정하는 위임자 인 CompiledBindableTemplateBuilder의 두 번째 인수에 있습니다. 편집 중, 제출하는 동안 템플릿 필드는 ExtractValuesFromCell을 호출하고 IBindableTemplate을 복구합니다.이 템플릿에서 사전을 추출한 다음 그 값을 가져 와서 자신의 사전에 추가합니다. 그러면 사전에 업로드 된 것으로 변환됩니다. 데이터. 그래서 Binding 델리게이트에서 OrderedDictionary를 반환합니다. 희망이 도움이됩니다!

관련 문제