Ich hatte die Woche viel mit dem GridView Control zu tun, dabei stand ich dann vor dem Problem das ich Controls im EmptyDataTemplate haben wollte um halt einen ersten Datensatz anzulegen. Nachdem ich in Google und Msdn nichts gescheites gefunden habe musste eine Lösung her. Diese möchte ich euch hier näherbringen. Das komplette Beispiel befindet sich am Ende des Artikels.
Leider liessen sich diese Controls nicht so einfach finden aber ich musste ja an ihre Werte kommen.
Wenn man sich dann mal den HTML text anschaut der rauskommt wenn das EmptyDataTemplate angezeigt wird wird es schon klarer was man zu tun hat um die controls anzusprechen.
<input name="GridView1$ctl01$txtFirstName" type="text" id="GridView1_ctl01_txtFirstName" /> |
Es hat den Anschein das das EmptyDataTemplate die id "ctl01" hat.
Sprich wir müssen per FindControl das Control mit der id "ctl01" suchen und können dann in diesem Control nach unseren Controls suchen.
// get the emptydatatemplate as a control. its name is clt01.
Control emptydatatemplate = this.GridView1.FindControl("ctl01");
// get the 3 textbox controls.
TextBox firstname = (TextBox)emptydatatemplate.FindControl("txtFirstName");
TextBox lastname = (TextBox)emptydatatemplate.FindControl("txtLastName");
TextBox accountnr = (TextBox)emptydatatemplate.FindControl("txtAccountNr"); |
Da in der Überschriftinsert data steht machen wir das natürlich noch. Folgendes Beispiel geht von einer konfigurierten SqlDataSource aus und einem mit Controls gefüllten EmtpyDataTemplates, welches einen Button btnNew enthält.
void btnNew_Click(object sender, EventArgs e)
{
// exec the insert proc for your datasource.
this.CustomerSource.Insert();
}
protected void CustomerSource_Inserting(object sender, SqlDataSourceCommandEventArgs e)
{
// get the emptydatatemplate as a control. its name is clt01.
Control emptydatatemplate = this.GridView1.FindControl("ctl01");
// get the 3 textbox controls.
TextBox firstname = (TextBox)emptydatatemplate.FindControl("txtFirstName");
TextBox lastname = (TextBox)emptydatatemplate.FindControl("txtLastName");
TextBox accountnr = (TextBox)emptydatatemplate.FindControl("txtAccountNr");
// set commands parameter values ...
e.Command.Parameters[ "@FirstName"].Value=firstname.Text;
e.Command.Parameters[ "@LastName"].Value=lastname.Text;
e.Command.Parameters[ "@AccountNumber"].Value=Int32.Parse(accountnr.Text);
} |
Dieser Code ruft auf btnNew Click die Insert Methode der SqlDataSource auf. Die benötigten Parameter werden im Inserting Eventhandler mit den Werten der Controls die sich im EmptyDataTemplate befinden gefüllt, sodass ein Reibungsfreies Insert erfolgen kann. Hier im Beispiel wird natürlich nichts validiert ihr solltet das aber tun.
Hier zum Abschluss noch einmal das komplette Beispiel:
<% @ Page Language="C#" %>
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
< script runat="server">
void btnNew_Click(object sender, EventArgs e)
{
// exec the insert proc for your datasource.
this.CustomerSource.Insert();
}
protected void CustomerSource_Inserting(object sender, SqlDataSourceCommandEventArgs e)
{
// get the emptydatatemplate as a control. its name is clt01.
Control emptydatatemplate = this.GridView1.FindControl("ctl01");
// get the 3 textbox controls.
TextBox firstname = (TextBox)emptydatatemplate.FindControl("txtFirstName");
TextBox lastname = (TextBox)emptydatatemplate.FindControl("txtLastName");
TextBox accountnr = (TextBox)emptydatatemplate.FindControl("txtAccountNr");
// set commands parameter values ...
e.Command.Parameters[ "@FirstName"].Value=firstname.Text;
e.Command.Parameters[ "@LastName"].Value=lastname.Text;
e.Command.Parameters[ "@AccountNumber"].Value=Int32.Parse(accountnr.Text);
}
</ script>
< html xmlns="http://www.w3.org/1999/xhtml" >
< head runat="server">
<title>Customer list</title>
</ head>
< body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True"
AutoGenerateColumns="False" DataKeyNames="Id" DataSourceID="CustomerSource">
<Columns>
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True" ShowSelectButton="True" />
<asp:BoundField DataField="Id" HeaderText="Id" InsertVisible="False" ReadOnly="True"
SortExpression="Id" />
<asp:BoundField DataField="FirstName" HeaderText="FirstName" SortExpression="FirstName" />
<asp:BoundField DataField="LastName" HeaderText="LastName" SortExpression="LastName" />
<asp:BoundField DataField="AccountNumber" HeaderText="AccountNumber" SortExpression="AccountNumber" />
</Columns>
<EmptyDataTemplate>
<asp:TextBox ID="txtFirstName" runat="server"></asp:TextBox>
<asp:TextBox ID="txtLastName" runat="server"></asp:TextBox>
<asp:TextBox ID="txtAccountNr" runat="server"></asp:TextBox>
<asp:Button ID="btnNew" runat="server" Text="New Customer" OnClick="btnNew_Click"/>
</EmptyDataTemplate>
</asp:GridView>
<asp:SqlDataSource ID="CustomerSource" runat="server" ConnectionString="<%$ ConnectionStrings:connstr %>"
DeleteCommand="DELETE FROM [Customers] WHERE [Id] = @Id"
InsertCommand="INSERT INTO [Customers] ([FirstName], [LastName], [AccountNumber]) VALUES (@FirstName, @LastName, @AccountNumber)"
SelectCommand="SELECT [FirstName], [Id], [LastName], [AccountNumber] FROM [Customers]"
UpdateCommand="UPDATE [Customers] SET [FirstName] = @FirstName, [LastName] = @LastName, [AccountNumber] = @AccountNumber WHERE [Id] = @Id" OnInserting="CustomerSource_Inserting">
<DeleteParameters>
<asp:Parameter Name="Id" Type="Int32" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="FirstName" Type="String" />
<asp:Parameter Name="LastName" Type="String" />
<asp:Parameter Name="AccountNumber" Type="Int32" />
<asp:Parameter Name="Id" Type="Int32" />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name="FirstName" Type="String" />
<asp:Parameter Name="LastName" Type="String" />
<asp:Parameter Name="AccountNumber" Type="Int32" />
</InsertParameters>
</asp:SqlDataSource>
</div>
</form>
</ body>
</ html> |
Mfg