Génération automatique des templates field d'un gridView[Problème avec l'édition]
Bonjour
j'essaie d'afficher les colones de ma source de données d'une façon dynamique à partir de la classe suivante:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
|
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Specialized;
using System.Data.SqlClient;
public class DynamicallyTemplatedGridViewHandler : ITemplate
{
#region data memebers
ListItemType ItemType;
string FieldName;
string InfoType;
#endregion
#region constructor
public DynamicallyTemplatedGridViewHandler(ListItemType item_type, string field_name, string info_type)
{
ItemType = item_type;
FieldName = field_name;
InfoType = info_type;
}
#endregion
#region Methods
public void InstantiateIn(System.Web.UI.Control Container)
{
switch (ItemType)
{
case ListItemType.Header:
Literal header_ltrl = new Literal();
header_ltrl.Text = "<b>" + FieldName + "</b>";
Container.Controls.Add(header_ltrl);
break;
case ListItemType.Item:
switch (InfoType)
{
case "Command":
ImageButton edit_button = new ImageButton();
edit_button.ID = "edit_button";
edit_button.ImageUrl = "~/Commun/Images/edit_small.png";
edit_button.CommandName = "Edit";
edit_button.Click += new ImageClickEventHandler(edit_button_Click);
edit_button.ToolTip = "Edit";
Container.Controls.Add(edit_button);
ImageButton delete_button = new ImageButton();
delete_button.ID = "delete_button";
delete_button.ImageUrl = "~/Commun/Images/delete2.png";
delete_button.CommandName = "Delete";
delete_button.ToolTip = "Delete";
//delete_button.OnClientClick = "return confirm('Are you sure to delete the record?')";
Container.Controls.Add(delete_button);
/* Similarly add button for insert.
* It is important to know when 'insert' button is added
* its CommandName is set to "Edit" like that of 'edit' button
* only because we want the GridView enter into Edit mode,
* and this time we also want the text boxes for corresponding fields empty*/
ImageButton insert_button = new ImageButton();
insert_button.ID = "insert_button";
insert_button.ImageUrl = "~/Commun/Images/add2.png";
insert_button.CommandName = "Edit";
insert_button.ToolTip = "Insert";
insert_button.Click += new ImageClickEventHandler(insert_button_Click);
Container.Controls.Add(insert_button);
break;
default:
Label field_lbl = new Label();
field_lbl.Text = String.Empty; //we will bind it later through 'OnDataBinding' event
field_lbl.DataBinding += new EventHandler(OnDataBinding);
Container.Controls.Add(field_lbl);
break;
}
break;
case ListItemType.EditItem:
if (InfoType == "Command")
{
ImageButton update_button = new ImageButton();
update_button.ID = "update_button";
update_button.CommandName = "Update";
update_button.ImageUrl = "~/images/update.gif";
if ((int)new Page().Session["InsertFlag"] == 1)
update_button.ToolTip = "Add";
else
update_button.ToolTip = "Update";
//update_button.OnClientClick = "return confirm('Are you sure to update the record?')";
Container.Controls.Add(update_button);
ImageButton cancel_button = new ImageButton();
cancel_button.ImageUrl = "~/images/cancel.gif";
cancel_button.ID = "cancel_button";
cancel_button.CommandName = "Cancel";
cancel_button.ToolTip = "Cancel";
Container.Controls.Add(cancel_button);
}
else// for other 'non-command' i.e. the key and non key fields, bind textboxes with corresponding field values
{
TextBox field_txtbox = new TextBox();
field_txtbox.Text = String.Empty;
//if Inert is intended no need to bind it with text..keep them empty
if ((int)new Page().Session["InsertFlag"] == (int)EnumInsertFlag.Edit)
field_txtbox.DataBinding += new EventHandler(OnDataBinding);
Container.Controls.Add(field_txtbox);
}
break;
case ListItemType.Footer:
if(InfoType!="Command")
{
TextBox MonTextBox = new TextBox();
MonTextBox.Text = String.Empty;
Container.Controls.Add(MonTextBox);
}
break;
}
}
#endregion
#region Event Handlers
//just sets the insert flag ON so that we ll be able to decide in OnRowUpdating event whether to insert or update
protected void insert_button_Click(Object sender,ImageClickEventArgs e)
{
new Page().Session["InsertFlag"] = (int)EnumInsertFlag.Insert;
}
//just sets the insert flag OFF so that we ll be able to decide in OnRowUpdating event whether to insert or update
protected void edit_button_Click(Object sender, ImageClickEventArgs e)
{
new Page().Session["InsertFlag"] = (int)EnumInsertFlag.Edit;
}
private void OnDataBinding(object sender, EventArgs e)
{
object bound_value_obj = null;
Control ctrl = (Control)sender;
IDataItemContainer data_item_container = (IDataItemContainer)ctrl.NamingContainer;
bound_value_obj = DataBinder.Eval(data_item_container.DataItem, FieldName);
switch (ItemType)
{
case ListItemType.Item:
Label field_ltrl = (Label)sender;
field_ltrl.Text = bound_value_obj.ToString();
break;
case ListItemType.EditItem:
TextBox field_txtbox = (TextBox)sender;
field_txtbox.Text = bound_value_obj.ToString();
break;
}
}
#endregion
} |
pour l'affichage ce code marche à merveille mais qand j'édite ,les données ne s'affiche plus comme si la grille n'est plus Bind(é) ,voici le code Behind de ma page
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ChargerGrilleMoyensFinanciers();
LoadListeMoyensFinancier();
}
}
private void LoadListeMoyensFinancier()
{
UmsProjet ProjetCourant = MonProjetService.RechercherProjetParId(IdProjet);
DataSet1 MonDataSet = MonMoyenFinancierService.RecupererGrilleMoyenFinancier(ProjetCourant);
ListeMoyensFinanciers.DataSource = MonDataSet.maTable;
ListeMoyensFinanciers.DataBind();
IList<UmsRubriqueBudgetaire> MesRubriquesBudgetaires = MaRubriqueBudgetService.Tout();
DropDownList FooterListe = (DropDownList)ListeMoyensFinanciers.FooterRow.FindControl("ListeRubriquesBudgetaires");
FooterListe.DataSource = MesRubriquesBudgetaires;
FooterListe.DataBind();
}
private void ChargerGrilleMoyensFinanciers()
{
UmsProjet ProjetCourant = MonProjetService.RechercherProjetParId(IdProjet);
DataSet1 MonDataSet = MonMoyenFinancierService.RecupererGrilleMoyenFinancier(ProjetCourant);
DataTable UneTable = MonDataSet.maTable;
//ListeMoyensFinanciers.Columns.Clear();
foreach (DataColumn Column in UneTable.Columns)
{
if (Column.ColumnName != "Id" & Column.ColumnName!="Designation")
{
TemplateField MyColumnTemplate = new TemplateField();
MyColumnTemplate.HeaderText = Column.ColumnName;
MyColumnTemplate.ItemTemplate = new DynamicallyTemplatedGridViewHandler(ListItemType.Item, Column.ColumnName, UneTable.Columns[Column.ColumnName].DataType.Name);
MyColumnTemplate.EditItemTemplate = new DynamicallyTemplatedGridViewHandler(ListItemType.EditItem, Column.ColumnName, UneTable.Columns[Column.ColumnName].DataType.Name);
MyColumnTemplate.FooterTemplate = new DynamicallyTemplatedGridViewHandler(ListItemType.Footer, Column.ColumnName, UneTable.Columns[Column.ColumnName].DataType.Name);
ListeMoyensFinanciers.Columns.Add(MyColumnTemplate);
}
}
TemplateField MyButton = new TemplateField();
MyButton.ItemTemplate = new DynamicallyTemplatedGridViewHandler(ListItemType.Item, "CRUD", "Command");
MyButton.EditItemTemplate = new DynamicallyTemplatedGridViewHandler(ListItemType.EditItem, "INSERT", "Command");
ListeMoyensFinanciers.Columns.Add(MyButton);
}
public void Editer_MoyenFinancier(object sender,GridViewEditEventArgs e)
{
int RowIndex = e.NewEditIndex;
ListeMoyensFinanciers.EditIndex = RowIndex;
ListeMoyensFinanciers.Rows[RowIndex].RowState = DataControlRowState.Edit;
ListeMoyensFinanciers.DataBind();
Session["SelecetdRowIndex"] = e.NewEditIndex;
}
public void Supprimer_MoyenFinancier(object sender, GridViewDeleteEventArgs e)
{
ChargerGrilleMoyensFinanciers();
}
public void Annuler_Editer_MoyenFinancier(object sender, GridViewCancelEditEventArgs e)
{
ListeMoyensFinanciers.EditIndex = -1;
ListeMoyensFinanciers.DataBind();
Session["SelecetdRowIndex"] = -1;
}
public void MAJ_MoyenFinancier(object sender, GridViewUpdateEventArgs e)
{
ChargerGrilleMoyensFinanciers();
} |
je suis vraiment bloqué et j'attends vraiment vos remarques
Merci:cry: