optimisation sur datagrid
Bonjour,
J'ai remarque que lors de l'utilisation du composant datagird, beaucoup de code source (dont celui sur msdn), lors de leur utilisation avec le mode edition, ont pour habitude de recharger les donnees a partir de la source a chaque fois. Par exemple, dans le morceau de code lie a l'evenement du clic sur le bouton editer, les donnees sont enregistree dans la bdd, et un select* est fait ensuite.
Je travail avec un xml, mais je ne souhaite pas que mes modifications soit écrites a chaque fois dans le fichier. Pour cela, j'utilise le premier argument de l'événement pour recréer un tableau pour ré-alimenter le datagrid. Du coup, pas besoin de ré-acceder a ma source. Mais avec cette méthode, si je clic pour éditer une ligne, et que je clic sur le bouton éditer d'une autre ligne ensuite, je me rends compte que les données présente sur la première ligne que j'avais voulu éditer ont disparus!
Tout-en bas, je vais ajouter mon code d'exemple, si quelqu'un veut tester pour voir le problème.
1)Le fait de vouloir éviter de recharger les données comme je le fais dans le code plus bas est-il une bonne idée?
2)Est-il possible de résoudre proprement mon problème d'édition?
3)Si j'ajoute un bouton supplémentaire pour faire la sauvegarde en dessous du datagrid, comment puis-je récupérer les donnees qui se trouvaient dans celui-ci?
Merci d'avance pour votre aide.
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
|
<%@ Page Language="C#" Debug="true" AutoEventWireup="True" %>
<%@ Import Namespace="System.Data" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html >
<script language="C#" runat="server">
ICollection CreateDataSource()
{
DataTable dt = new DataTable();
DataRow dr;
dt.Columns.Add(new DataColumn("IntegerValue", typeof(Int32)));
dt.Columns.Add(new DataColumn("StringValue", typeof(string)));
dt.Columns.Add(new DataColumn("CurrencyValue", typeof(double)));
for (int i = 0; i < 9; i++)
{
dr = dt.NewRow();
dr[0] = i;
dr[1] = "Item " + i.ToString();
dr[2] = 1.23 * (i + 1);
dt.Rows.Add(dr);
}
DataView dv = new DataView(dt);
return dv;
}
public void ItemsGrid_OnLoad(Object sender, DataGridCommandEventArgs e)
{
lblTest.Text = "load Grid";
lblTest2.Text = "load Grid";
}
public void maGrilleEditHandler(Object sender, DataGridCommandEventArgs e)
{
DataTable dt = new DataTable();
DataRow dr;
dt.Columns.Add(new DataColumn("IntegerValue", typeof(Int32)));
dt.Columns.Add(new DataColumn("StringValue", typeof(string)));
dt.Columns.Add(new DataColumn("CurrencyValue", typeof(double)));
DataGrid test = (DataGrid)sender;
ItemsGrid.EditItemIndex = e.Item.ItemIndex;
/* utilisation de object sender pour recreer mon tableau de donnees plutot
que de tout recharger \o/ */
for (int lineNB = 0; lineNB < test.Items.Count; ++lineNB)
{
dr = dt.NewRow();
for (int colNB = 1; colNB < test.Items[lineNB].Cells.Count; ++colNB)
{
if (test.Items[lineNB].Cells[colNB].Text.Length == 0)
dr[colNB - 1] = 0;
else
dr[colNB - 1] = test.Items[lineNB].Cells[colNB].Text;
}
dt.Rows.Add(dr);
}
ItemsGrid.DataSource = new DataView(dt);
ItemsGrid.DataBind();
}
void Page_Load(Object sender, EventArgs e)
{
if (!IsPostBack)
{
lblTest.Text = "page_load";
// Load this data only once.
ItemsGrid.DataSource = CreateDataSource();
ItemsGrid.DataBind();
lblTest2.Text = "page_load";
}
}
</script>
<head id="Head1" runat="server">
<title>DataGrid Example</title>
</head>
<body>
<form id="form1" runat="server">
<h3>DataGrid Example</h3>
<p><asp:Label ID="lblTest" runat="server" Text="vide"></asp:Label></p>
<b>Product List</b>
<asp:DataGrid id="ItemsGrid"
BorderColor="black"
BorderWidth="1"
CellPadding="3"
AutoGenerateColumns="true"
OnEditCommand="maGrilleEditHandler" EditItemStyle-BackColor="#AAAAAA"
runat="server">
<EditItemStyle BackColor="#AAAAAA"></EditItemStyle>
<Columns>
<asp:EditCommandColumn EditText="Editer" ButtonType="PushButton"
UpdateText="Valider" CancelText="Annuler" HeaderText="Actions"/>
</Columns>
<HeaderStyle BackColor="#00aaaa">
</HeaderStyle>
</asp:DataGrid>
</form>
<p><asp:Label ID="lblTest2" runat="server" Text="vide"></asp:Label></p>
</body>
</html> |
PS: l'exemple ne contient pas de connection a une bdd ou a un xml pour simplifier les tests ;)