FAQ ASP.NET / Delphi.NET
FAQ ASP.NET / Delphi.NETConsultez toutes les FAQ
Nombre d'auteurs : 15, nombre de questions : 90, dernière mise à jour : 16 juin 2021
- Comment changer la taille de la textbox d'édition de mon datagrid ?
- Comment changer la couleur d'une cellule d'un datagrid ?
- Comment rendre une colonne invisible si AutoGenerateColumns="true" ?
- Comment adapter la hauteur du datagrid en fonction du nombre de lignes à afficher ?
- Comment ajouter une colonne de webcontrols dans un datagrid ?
- Comment n'afficher que l'heure d'une champ type DateTime dans un datagrid ?
- Comment lier une Css à un Datagrid ?
Voici un petit exemple de code :
Dans la page .aspx :
<asp:DataGrid id
=
"MonDatagrid"
runat
=
"server"
AutoGenerateColumns
=
"False"
>
<Columns>
<asp:TemplateColumn HeaderText
=
"Colonne1"
>
<ItemTemplate>
<%
#Container.DataItem
(
"nomdemacolonne"
)%>
</ItemTemplate>
<EditItemTemplate>
<asp:Textbox runat
=
"server"
width
=
"600"
maxlength
=
"600"
/>
</EditItemTemplate>
</asp:TemplateColumn>
dans le code-behind
procedure
TWebForm1.MonDatagrid_PreRender(sender: System.Object
; e: System.EventArgs);
var
matextbox : TextBox ;
begin
if
MonDatagrid.EditItemIndex > -1
then
begin
matextbox := MonDatagrid.Items[MonDatagrid.EditItemIndex].Cells[0
].Controls[0
] as
TextBox ;
matextbox.Width := System.Web.UI.WebControls.Unit
.Parse('4cm'
) ;
// Unit etant un mot clé dans Delphi, on met sa hierarchie devant
// on peut biensur changer d'autre propriétées de la textbox d'édition des données ;-)
end
;
end
;
Dans cette exemple on va mettre un fond rouge à toutes les cellules de la 4ème ligne de "Mondatagrid", sachant qu'il comporte 4 colonnes :
procedure
TWebForm1.Mondatagrid_ItemDataBound(sender: System.Object
; e: System.Web.UI.WebControls.DataGridItemEventArgs);
begin
if
not
e.Item.ItemIndex = -1
then
begin
if
e.Item.ItemIndex = 4
then
begin
e.Item.Cells[0
].BackColor := System.Drawing.Color.Red ;
e.Item.Cells[1
].BackColor := System.Drawing.Color.Red ;
e.Item.Cells[2
].BackColor := System.Drawing.Color.Red ;
e.Item.Cells[3
].BackColor := System.Drawing.Color.Red ;
end
;
end
;
end
;
En effet, beaucoup d'entre nous l'ont remarqué, lorsque le datagrid a sa propriété AutoGenerateColumns à "true" le code :
Mondatagrid.columns[1
].visible := False
;
NE MARCHE PAS En effet ce code ne marche que si votre datagrid est fait à base de templates columns. Il existe cependant une astuce : dans la page aspx :
<asp:DataGrid id
=
"Mondatagrid"
runat
=
"server"
AutoGenerateColumns
=
"True"
OnItemDataBound
=
"Mondatagrid_OnItemDataBound"
/>
dans le code-behind
procedure
TWebForm1.Mondatagrid_ItemDataBound(sender: System.Object
; e: System.Web.UI.WebControls.DataGridItemEventArgs);
begin
e.Item.Cells[1
].Visible := False
;
end
;
Cette question va paraître simpliste pour certain, mais en parcourrant notre forum je me suis aperçu qu'on avait été pas mal à se prendre là tête la dessus.
Quand on utilise un datagrid avec l'option AutoGenerateColumns="true" on a la hauteur du datagrid qui s'ajuste automatiquement en fonction du nombre de ligne qu'affiche la page.
Par contre, si on décide de spécifier manuellement les colonnes, et donc qu'on met AutoGenerateColumns="false", ce n'est plus la hauteur du datagrid qui s'adapte en fonction du nombre de lignes à afficher mais la hauteurs de lignes qui varie. On peut ainsi se retrouver avec 2 lignes qui prennent toute la largeur du datagrid qui affiche normalement 10 lignes.
La solution à ce problème est ultra simple (encore fallait-il trouver) il suffit juste de ne pas préciser la hauteur (height) du datagrid !!!
Dans cet exemple nous allons ajouter une colonne de boutons : Dans le code de la page aspx :
<Columns>
<asp:TemplateColumn>
<HeaderStyle Width
=
"600px"
></HeaderStyle>
<ItemTemplate>
<asp:Button id
=
"Button1"
runat
=
"server"
Text
=
"NotreBouton"
></asp:Button>
</ItemTemplate>
</asp:TemplateColumn>
<Columns>
Dans le <itemTemplate> on peut mettre n'importe quel webcontrol.
Il y a aussi la balise <EditItemTemplate> dans laquelle on met le webcontrol affiché quand la cellule où se trouve le <iItemTemplate> est en mode édition.
Si vous possédez Visual Studio, il y a encore plus simple :
Allez dans le property builder du datagrid => Columns, et changez une boundsColumns en template columns à l'aide d'un lien en bas de la fenêtre. Ensuite du sortez du property builder, faites un click droit sur le datagrid => édit template. Et la vous pouvez éditer la template column avec l'IDE en faisant du Drag & Drop.
Chaque colonne d'un datagrid à une propriété DataFormatString. Pour n'afficher que l'heure d'un champ DateTime la chaîne de caractères à mettre pour la propriété DataFormatString est :
Pour plus d'informations sur les formats personnalisés d'affichage de DateTime voir le site MSDN
- {0:HH:mm} : pour afficher les heures (de 0 à 24) et les minutes
- {0:hh:mm} : pour afficher les heures (de 1 à 12) et le minutes
- {0:HH:mm:s} : pour afficher les heures (de 0 à 24), les minutes et les secondes
Lien : Custom DateTime Format Strings
Lien : Comment formater une date pour l'affichage ?
Le principe est le même pour lier un Datagrid à une Css que pour lier un Calendar à une Css : il faut lier chaque style définissant l'aspect du webcontrol à une classe Css. Pour éviter la redondance d'informations sur cette FAQ je vous renvoie à la question : "Comment lier une Css à un Calendar ?"