我有一个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 :(得分: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的原因。希望有所帮助!