2

プログラムでテンプレート フィールドを追加するグリッドビューがあります。各テンプレート フィールドにはテキスト ボックスがあります。このテキスト ボックスをデータベース列に双方向でバインドしたいと考えています。以下のコードを参照してください。

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

テキストを編集すると、この変更がデータベースにも反映されるようにテキスト ボックスを作成するにはどうすればよいですか?

皆様、お時間をありがとうございました

4

2 に答える 2

0

t.Text = DataBinder.Eval(dv.DataItem, columnName).ToString();おそらく、行を次のようなものに変更できますt.Text= string.Format("<%# Bind(\"{0}\") %>", columnName);か?

これは単なる推測です...

それがうまくいかない場合は、双方向のデータバインディングを処理するための新しいクラスを実際に記述している記事をいくつか見つけました。

2005年頃のCodeProjectの記事

プログラマー天国の記事

うまくいけば、これらのオプションの1つが役立つでしょう。

于 2010-02-06T22:53:38.300 に答える
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 の 2 番目の引数にあります。編集後、送信中に、テンプレート フィールドは ExtractValuesFromCell を呼び出し、IBindableTemplate を回復します。そこからディクショナリが抽出され、そこから値が取り出され、独自のディクショナリに追加され、最終的にアップロードされます。データ。そのため、Binding デリゲートから OrderedDictionary を返します。それが役立つことを願っています!

于 2010-03-24T15:17:32.070 に答える