Ajout de dynamique de textbox dans le footer d'un datagrid

Description

<!-- Cet extrait de code montre :
Comment creer dynamiquement des textBox dans le footer d'un DataGrid
Le Nb de TextBox est variable, indiqué par une DropDownList
Suit un test de remplissage dans le 'Page_load' C'est ça l'astuce.
Si les boites sont bien remplies, elles disparaissent au postBack et le contenu va dans la base
Si elles sont mal remplies les boites réapparaissent avec un message d'info
Commentaire :
On remarque l'utilisation d'un conteneur (une TableCell ici) pour les textBox. j'ai trouvé que ça comme solution pour
faire appel à l'ID_client avec FindControl("ID_client"). Si vous avez mieux, vous gênez pas pour le dire....
La page est créée avec DreamWeaver, elle n'est bien sûr pas fonctonelle.-->

Source / Exemple :


<%@ Page Explicit="True" Language="VB" Debug="True" EnableViewstate="True" AutoEventWireup="true"%>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script runat="server">
'Déclaration des variables communes aux "Sub"
	Dim Conn As OleDbConnection = New OleDbConnection
   Dim Chem as string						'Chemin conduisant à la base
   Dim ConnString, SelectSql As String
   Dim Commande As OleDbCommand
	Dim StrOleDb as string
	
	Dim CreaTest as boolean
	Dim Nb, h As Integer
	
	Dim VerifNR as boolean
'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Sub Page_Load(Src As Object, E As EventArgs)
chem=ConfigurationSettings.AppSettings("chem") 'le chemin est enregistré dans le "Web.config"
ConnString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath(chem)
Conn= New OleDbConnection(ConnString)

'Nb est le nombre indiqué par la dropDownList du footer
Nb=ViewState("Nb") 

	If Not IsPostBack Then
		Session("CreaTest")=false
			'Charger le dataGrid	
		SelectSql = "Select * From [Ma_table] etc..." 
		ChargerData(SelectSql,MonDataGrid)
	
	'Si des boites ont été créées
	elseif 		Page.IsPostBack    andalso Ctype(Session("CreaTest"),Boolean) then  			
				 VerifNR = true 'initialisation de la variable test
					'Verification des remplissages (ou autre vérif)
				 dim striNom  as string
					'L'ID_Client peut dépendre du nb d'enregistrements si on met des contrôles dans les items (ici des checkBox par ex)
				Dim  NOrdre as integer= (MonDataGrid.items.count + 2) ' le nombre "2" ne sera pas forcément le même
					 'boucle de vérification des remplissages
			for h=1 to Nb 
				striNom  = request.Form("MonDataGrid:_ctl" & NOrdre & ":tbNomAd" & h)
'(NB._ L'ID-Client s'obtient  en affichant la page et en "afficher la source")
					if striNom=""
					VerifNR=false
					end if
			next
						'Si c'est mal rempli, on recharge les textBox 
					if VerifNR = false  
					AjouterControl(Nb)
					else
						'autrement elles disparaissent et la variable da session est réinitialisée
						Session("CreaTest")=false 
					end if

	End If
End Sub
'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Sub AjouterControl(Nb as integer)
'"placeNom" est le nom de la tableCell qui contiendra les contrôles .
'Un autre conteneur qui possède une ID_client  peut parfaitement convenir (un Control Panel doit sûrement marcher)
	Dim Cont as TableCell=Ctype(page.findcontrol("MonDataGrid:_ctl" & (MonDataGrid.items.count + 2) & ":placeNom"),TableCell)
				CreerControle(Nb ,Cont,"tbNomAd",110,14)
End Sub
'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Sub jeterControl()
	Dim Cont as TableCell=Ctype(page.findcontrol("MonDataGrid:_ctl" & (MonDataGrid.items.count + 2) & ":placeNom"),TableCell)
			Cont.Controls.Clear()
	Cont.dispose	
End Sub
'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Sub CreerControle(N as integer, conteneur as object, Ident as String, larg as integer, Max as integer)

						for h=1 to N
						dim tbNomAd As New TextBox
						tbNomAd.ID=Ident & h 						'identification
						tbNomAd.Attributes("runat")="server"
						
							tbNomAd.Width=New Unit(larg & "px")		'Réglages divers
							tbNomAd.height=New Unit("17px")
			 				tbNomAd.MaxLength=Max

						conteneur.Controls.Add(tbNomAd)
						conteneur.Controls.Add(New LiteralControl("<br>")) 'pour que les contrôles s'affichent l'un sous l'autre
						 tbNomAd.Dispose()
						next
End Sub
'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Sub ChargerData(ChaineSQL as string, XGrid as DataGrid)

Commande = New OleDbCommand(ChaineSQL, Conn)
Conn.Open
XGrid.DataSource=Commande.ExecuteReader()
XGrid.DataBind

End Sub

'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Sub commander(source As Object, e As System.Web.UI.WebControls.DataGridCommandEventArgs)

Dim btnAn As Button = CType(e.Item.FindControl("btnAn"), Button)
Dim btnAdd As Button = CType(e.Item.FindControl("btnAdd"), Button)
Dim lnkAdd As LinkButton = CType(e.Item.FindControl("lnkAdd"), LinkButton)

'COMMANDE DU LINKBUTTON "LNKADD"
if e.commandName="Insert" then 

			jeterControl 'on commence par virer les anciens s'ils existent

			Dim dpNb As DropDownList= CType(e.Item.FindControl("dpNb"), DropDownList)
			Dim Nb As Integer =dpNb.SelectedValue
			
'RAJOUT DES TEXTBOX
						AjouterBoites(Nb)
						Viewstate("Nb")=Nb
						'Variable servant à tester si des boites ont été créées 
						Session("CreaTest")=true
						
'COMMANDE DU BUTTON "BTNADD"
elseif e.commandName="Ajouter" then 
 
 			Dim dpNb As DropDownList= CType(e.Item.FindControl("dpNb"), DropDownList)
			Dim Nb As Integer =dpNb.SelectedValue
			Dim NOrdre as string = CStr(MonDataGrid.Items.count +2) 
		Nb=ViewState("Nb")
		
'Ici on met les messages d'alerte suite à la vérification du contenu des textBox dans le Page_Load, qui aboutira à "exit sub"
		If VerifNR = false  then
		Message.text="<br>Remplissez les boites !<br>"
		exit sub
		end if

'ENVOI vers la base de données car tout est OK
		Message.text=""
	for h=1 to Nb

Dim TxtbNomAdd as String =request.form("MonDataGrid:_ctl" & NOrdre & ":tbNomAd" & h)
StrOleDb="Insert Into [Ma_Table]  (MonChamp) Values (@TxtbNomAdd)"

						Commande=New OleDbCommand(StrOleDb, Conn)
					Conn.Open
						Commande.Parameters.Add("@TxtbNomAdd", TxtbNomAdd)
						Commande.ExecuteNonQuery()
						Conn.Close
	next		
					SelectSql = "Select * From [Ma_Table] " 
					ChargerData(SelectSql, MonDataGrid)	
						MonDataGrid.EditItemIndex=-1

'COMMANDE DU BUTTON "BTNAN"
elseif e.commandName="AnnulAjout" then 

		'la variable indiquant que des boites ont été créées est remise à false
		Session("CreaTest")=false 
		
		'les controles sont effacés
		jeterControl

end if
</script>

</head>
<body >

<form runat="server">

<!-- Pour les infos -->
<asp:Label ID="Message" runat="server" ForeColor="#5B5BDF"></asp:Label>
<!-- Le DataGrid -->
<asp:DataGrid ID="MonDataGrid" Width="100%"  AutoGenerateColumns="false"  OnItemCommand="commander"  ShowFooter="true"  runat="server" EnableViewState="true">
	<columns>
					<asp:TemplateColumn >

						<itemtemplate>
							<asp:CheckBox ID="ChkDel"  runat="server"></asp:CheckBox>
						</itemtemplate>
						<footertemplate>
							<asp:LinkButton ID="lnkAdd"  runat="server" AccessKey="A" Text="Ajouter" Visible="true" CommandName="Insert"/>
							<asp:DropDownList ID="dpNb" runat="server" AutoPostBack="false" >
								<asp:ListItem Value="0" ></asp:ListItem>
								<asp:ListItem Value="1" ></asp:ListItem>
								<asp:ListItem Value="2" ></asp:ListItem>
								<asp:ListItem Value="3" ></asp:ListItem>
								<asp:ListItem Value="4" ></asp:ListItem>
								<asp:ListItem Value="5" ></asp:ListItem>
							</asp:DropDownList><br>
							<asp:Button id="btnAn" runat="server"  Text="Ann" Visible="false"   CommandName="AnnulAjout"/>&nbsp;
							<asp:Button id="btnAdd" runat="server" Width="50" Text="OK" Visible="false"  CommandName="Ajouter"/>
						</footertemplate>
	</asp:TemplateColumn>									
		<asp:TemplateColumn HeaderText="Nom"  ><!-- Colonne où apparaissent les contrôles -->
						<itemtemplate>
							<asp:Label id=LabelNom  Font-Bold="true" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Nom") %>'/>
								<br>
						</itemtemplate>
						<footertemplate>
						<!-- Le conteneur des textBox -->
						<asp:Table runat="server"><asp:TableRow runat="server">
						<asp:TableCell ID="placeNom" runat="server"  BorderWidth="2px"></asp:TableCell>
						</asp:TableRow></asp:Table>
						</footertemplate>
		</asp:TemplateColumn>		
		
	</columns>
</asp:DataGrid>
<!-- Message d'info -->
<asp:Label ID="Averto" ForeColor="#FF3300" Font-Size="14" runat="server"/><br>

</form>
</body>
</html>

Conclusion :


Merci à JesusOnLine sans lequel je ramerais encore...

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.