ASP.NET 2.0中用Gridview控件操作数据——使用Gridview插入新记录

在Gridview控件中,可以实现插入新记录的操作(见《使用ASP.NET 2.0中的Gridview控件》)一文,但如果想实现在Gridview中,实现在Gridview控件的最后一行,提供一个空白行给用户输入要输入的记录,那无疑是很方便的。下面将介绍其实现方法。

首先,我们打算在让用户进行选择,当用户需要新增一记录时,便点击新增按钮,之后在Gridview的最后一行里,显示一个空白行,让用户按字段进行输入,如下图所示:

当用户决定不输入新空白记录时,可以按"cancel"按钮返回,该空白行消失。要实现这样的效果,我们可以充分利用Gridview的footer的模版功能进行自定义,因为有3列,所以,在每一列的footer模版中,定义如下:

<asp:Gridview Runat="server" DataSource DataKeyNames="CustomerID" AutoGenerateColumns="False" ShowFooter="True">

<Columns>

 <asp:TemplateField>

  <ItemTemplate>

   <asp:Label Runat="Server"><%# Eval("CustomerID") %></asp:Label>

  </ItemTemplate>

  <FooterTemplate>

   <asp:TextBox Runat="server"></asp:TextBox>

  </FooterTemplate>

 </asp:TemplateField>

 <asp:TemplateField>

  <ItemTemplate>

   <asp:Label Runat="Server"><%# Eval("CompanyName") %></asp:Label>

  </ItemTemplate>

  <FooterTemplate>

   <asp:TextBox Runat="server"></asp:TextBox>

  </FooterTemplate>

 </asp:TemplateField>

 <asp:TemplateField>

  <FooterTemplate>

   <asp:DropDownList Runat="server" DataSource DataTextField="ContactTitle" DataValueField="ContactTitle">

   </asp:DropDownList>

   <asp:SqlDataSource Runat="server" SelectCommand="SELECT DISTINCT [ContactTitle] FROM [Customers]"

ConnectionString="server=localhost;u>

   </asp:SqlDataSource>

   <asp:Button Runat="server" Text="Add" OnClick="Button1_Click" />

   <asp:Button Runat="server" Text="Cancel" OnClick="CancelButton1_Click" />

  </FooterTemplate>

 <ItemTemplate>

  <asp:DropDownList SelectedValue=’<%# Bind("ContactTitle") %>’ Runat="Server" DataSource DataTextField="ContactTitle" DataValueField="ContactTitle" ></asp:DropDownList>

  <asp:SqlDataSource Runat="server" SelectCommand="SELECT DISTINCT [ContactTitle] FROM [Customers]"

ConnectionString="server=localhost;u EnableCaching="True">

  </asp:SqlDataSource>

 </ItemTemplate>

 </asp:TemplateField>

</Columns>

</asp:Gridview>

以上为Gridview的代码,可以看到,在第一,二列的<foottemplate>列中,分别提供了customerid和companyname两个文本框以供用户输入,在第三列的<footertemplate>列中,以dropdownlistbox的形式来显示contracttitle.。其中,请注意第三列的footertemplate中的add和cancel两个按钮的,它们的事件代码如下:

<script runat="server">

void CancelButton1_Click(object sender, EventArgs e)

{

 Gridview1.ShowFooter = false;

}

void AddButton1_Click(object sender, EventArgs e)

{

 Gridview1.ShowFooter = true;

}

 //点add按钮时,将新增的记录更新到数据库中去

void Button1_Click(object sender, EventArgs e)

{

 TextBox customerID = Gridview1.FooterRow.FindControl("CustomerIDTextBox") as TextBox;

 TextBox companyName = Gridview1.FooterRow.FindControl("CompanyNameTextBox") as TextBox;

 DropDownList ContactTitle = Gridview1.FooterRow.FindControl("ContactTitleDropDownList") as DropDownList;

 SqlDataSource1.InsertParameters["CustomerID"].DefaultValue = customerID.Text;

 SqlDataSource1.InsertParameters["CompanyName"].DefaultValue = companyName.Text;  

 SqlDataSource1.InsertParameters["ContactTitle"].DefaultValue=ContactTitle.SelectedValue;

 SqlDataSource1.Insert();

}

</script>

其中的cancel按钮的事件,用来取消显示Gridview的footer模版,因此设置showfooter属性为false,而addbutton1按钮,是当用户决定新增记录时点选的,此时将设置showfooter属性为true,以显示各列的foottemplate,从而达到显示新的一个空白行的目的。

而在更新代码button1_click事件中,将首先使用Gridview1.footerrow.findcontrol的方法,将用户新增的各字段的值提取出来,然后分别赋值给sqldatasource的insertparameters集合(注意要一一对应),最后使用sqldatasource的insert方法,就可以成功向数据库增加一条新记录了。

另外,为了在窗体加载时,显示数据库northwind中customers表的数据,需要设置sqldatsource1的属性,如下代码:

<asp:SqlDataSource Runat="server"

InsertCommand="INSERT INTO [Customers] ([CustomerID], [CompanyName], [ContactTitle]) VALUES (@CustomerID, @CompanyName, @ContactTitle)"

SelectCommand="SELECT top 5 [CustomerID], [CompanyName], [ContactTitle] FROM [Customers]"

ConnectionString="server=localhost;u>

<InsertParameters>

<asp:Parameter Type="String" Name="CustomerID"></asp:Parameter>

<asp:Parameter Type="String" Name="CompanyName"></asp:Parameter>

<asp:Parameter Type="String" Name="ContactTitle"></asp:Parameter>

</InsertParameters>

</asp:SqlDataSource>