2010-02-06 4 views
2

J'ai un gridview auquel j'ajoute des champs de modèle par programmation. Chacun des champs de modèle a une zone de texte. Je souhaite que cette zone de texte possède une liaison bidirectionnelle avec une colonne de base de données. S'il vous plaît voir ci-dessous le code.Comment lier une zone de texte dans un champ de modèle par programmation

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

}

J'appelle la classe ci-dessus comme suit

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

Comment puis-je faire de la zone de texte tel que, lorsque je modifie le texte, ce changement se reflète dans la base de données ainsi que?

Merci pour votre temps tout le monde

Répondre

0

Peut-être que vous pourriez changer la ligne t.Text = DataBinder.Eval(dv.DataItem, columnName).ToString(); à quelque chose comme t.Text= string.Format("<%# Bind(\"{0}\") %>", columnName);?

Ceci est juste une supposition ...

Si cela ne fonctionne pas, j'ai trouvé quelques articles qui écrivent en fait de nouvelles classes pour la manipulation de deux voies de liaison de données:

Article at CodeProject circa 2005

Article at Programmer's Heaven

Espérons que l'une de ces options sera utile.

0

En fait, ce n'est pas trop mal de faire des champs de modèle par programme, après l'avoir vu une fois, bien sûr. Voici comment nous le faisons, abrégée:

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

Alors, voici ce qui se passe. Nous utilisons CompiledBindableTemplateBuilder et CompiledTemplateBuilder pour construire le contenu de notre champ de modèle. L'utilisation d'un délégué est juste un moyen facile de configurer cela.

La clé permettant de répondre à votre question se trouve dans le second argument de CompiledBindableTemplateBuilder, qui est un délégué établissant la liaison. Après une modification, lors de la soumission, le champ template appellera ExtractValuesFromCell et récupèrera un IBindableTemplate, à partir duquel il extraira un dictionnaire, puis extraira la ou les valeur (s), en les ajoutant à son propre dictionnaire qui sera finalement converti en uploadé Les données. C'est pourquoi vous renvoyez un OrderedDictionary du délégué Binding. J'espère que cela pourra aider!

Questions connexes