Bonjour,
j'essai de contruire dynamiquement un datagrid à partir d'un fichier XML.
pour ça j'ai défini des Templatecolumn pour créer le contenu de mon datagrid.
quand il s'agit d'une clé primaire dans ma table crée dans le datagrid.
un BoundColumn avec une propriéte BoundColumn.ReadOnly = true;
du cout quand j'essai de mettre à jour mon datagrid je ne peux pas récupérer la valeur
de la clé primaire pour faire un update.
public class GenericItem : ITemplate
{
private readonly string column;
//private bool validate;
public GenericItem(string column)
{
this.column = column;
}
public void InstantiateIn(Control container)
{
Literal l = new Literal();
l.DataBinding += new EventHandler(this.BindData);
container.Controls.Add(l);
}
public void BindData(object sender, EventArgs e)
{
Literal l = (Literal)sender;
DataGridItem container = (DataGridItem)l.NamingContainer;
l.Text = ((DataRowView)container.DataItem)[column].ToString();
}
}
public class ValidateEditItem : ITemplate
{
private readonly string column;
public ValidateEditItem(string column)
{
this.column = column;
}
public void InstantiateIn(Control container)
{
TextBox tb = new TextBox();
tb.DataBinding += new EventHandler(this.BindData);
container.Controls.Add(tb);
tb.ID = column;
RequiredFieldValidator rfv = new RequiredFieldValidator();
rfv.Text = "please write!";
rfv.ControlToValidate = tb.ID;
rfv.Display = ValidatorDisplay.Dynamic;
rfv.ID = "validate" + tb.ID;
container.Controls.Add(rfv);
}
public void BindData(object sender, EventArgs e)
{
TextBox tb = (TextBox)sender;
DataGridItem container = (DataGridItem)tb.NamingContainer;
tb.Text = ((DataRowView)container.DataItem)[column].ToString();
}
}
public TemplateColumn DynamicColumns(string column, bool isEditable)
{
TemplateColumn genericcolumn = new TemplateColumn();
genericcolumn.HeaderText = column;
genericcolumn.ItemTemplate = new GenericItem(column);
if (isEditable)
{
genericcolumn.EditItemTemplate = new ValidateEditItem(column);
}
return genericcolumn;
}
la maniére dont je construit les colones
if (Type != null)
{
//cas d'une clé primaire
BoundColumn ColPk = new BoundColumn();
ColPk.DataField = c.ColumnName;
ColPk.SortExpression = c.ColumnName;
ColPk.ReadOnly = true;
Grid.Columns.Add(ColPk);
}else
{
//cas d'une Template column
TemplateColumn col;
col = DynamicColumns(c.ColumnName, true);
col.SortExpression = c.ColumnName;
Grid.Columns.Add(col);
}
Voici la fonction qui se déclenche au moment de l'update.
public void GridUpdate(Object sender, DataGridCommandEventArgs e)
{
//elle renvoie null
e.Item.FindControl("key").Text ;
//grid.Datakeys est vide
grid.DataKeys[e.Item.ItemIndex];
}
Merci pour votre aide.
blueangel13