如何以编程方式双向绑定模板字段中的文本框

时间:2010-02-06 16:19:38

标签: c# asp.net templatefield

我有一个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);

如何制作文本框,以便在编辑文本时,此更改也会反映在数据库中?

感谢大家的时间

2 个答案:

答案 0 :(得分: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

希望其中一个选项很有用。

答案 1 :(得分: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的原因。希望有所帮助!