2010-02-06 37 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 = DataBinder.Eval(dv.DataItem, columnName).ToString();喜欢的东西t.Text= string.Format("<%# Bind(\"{0}\") %>", columnName);

这只是一个猜测...

如果不工作,我发现了一些文章,实际上是写新的类来处理双向数据绑定:

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,从中提取一个Dictionary,然后从中提取值,将它们添加到它自己的字典中,最终变成上传的数据。所以这就是为什么你从Binding委托返回OrderedDictionary的原因。希望有所帮助!

相关问题