使用 Gridview 快速插入行, 无需控件命名
如果您讨厌在 gridview 的页脚行中命名控件以进行插入,那么这篇文章就是为您准备的。
引言
这段小代码可以轻松地将行插入到绑定到 sqldatasource
的 gridview
中。
背景
我讨厌...我是说讨厌在我的 gridview
的页脚行中放置和命名控件,以便我可以进行插入。我更讨厌的是使用 findcontrol("controlname") 查找页脚行中的所有控件,清除 sqlDatasources
插入参数,然后使用我刚刚创建的页脚中控件的值一次添加一个。这看起来很荒谬。所以我本周正在做一个项目,该项目实际上有 27 个需要允许插入的 gridview
。好的,所以我可以使用 detailsview
控件,但这太耗时了,而且看起来不太好,我只想让用户输入、选择或选中一些值,单击插入链接,然后完成工作。
是的,我可以将字段放在网格视图下面的表中,我知道,但我也讨厌那样。所以这是我想出的解决方案,我敢打赌你们中的一些人会很高兴拥有它。我花了大约 6 个小时才弄清楚,但是现在在我想要允许插入的每个 gridview
上实施它大约需要 5 分钟。
Using the Code
让我们从我们的 gridview
开始。这是一个很大的示例来演示这一点,尽管一个小的两个字段也可以很好地工作。首先要注意的是,每个字段的 SortExpression
都设置为 datasource
中相应字段的名称。如果您必须进行某种其他类型的排序,或者您不希望用户能够按所有字段进行排序,那么这将不适用于您,您必须采用较长的方式......对不起。
另请注意,已设置 OnRowCommad
,ShowFooter
为 true
并且 ID
列设置为 InsertVisible=False
。
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True"
AutoGenerateColumns="False" CellPadding="4" DataKeyNames="id" DataSourceID="UsersDS"
Caption="Manage Users" CaptionAlign="Left" ForeColor="#333333" GridLines="None"
ShowFooter="True" Font-Names="Arial" Font-Size="11px"
HorizontalAlign="Center" OnRowCommand="GridView1_RowCommand">
<AlternatingRowStyle BackColor="White" ForeColor="#284775" />
<Columns>
<asp:TemplateField ShowHeader="False" SortExpression="none">
<EditItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="True"
CommandName="Update" Text="Update"></asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False"
CommandName="Cancel" Text="Cancel"></asp:LinkButton>
</EditItemTemplate>
<FooterTemplate>
<asp:LinkButton ID="ftrInsert" runat="server"
Text="Insert" CommandName="ftrInsert">
</asp:LinkButton>
</FooterTemplate>
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False"
CommandName="Edit" Text="Edit"></asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False"
CommandName="Delete" Text="Delete"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="id" InsertVisible="False" SortExpression="id"
Visible="False">
<EditItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Eval("id") %>'></asp:Label>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label13" runat="server" Text='<%# Bind("id") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Company" SortExpression="Company">
<EditItemTemplate>
<asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("Company") %>'>
</asp:TextBox>
</EditItemTemplate>
<FooterTemplate>
<asp:DropDownList ID="ftrCompany" runat="server" DataSourceID="CompaniesDS"
DataTextField="Company_Name" DataValueField="id"> </asp:DropDownList>
</FooterTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Bind("Company") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Access Level" SortExpression="Access_Level">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Access_Level") %>'>
</asp:TextBox>
</EditItemTemplate>
<FooterTemplate>
<asp:DropDownList ID="ftrAccessLevel" runat="server" DataSourceID="AccessLevelsDS"
DataTextField="Access_Name" DataValueField="id"> </asp:DropDownList>
</FooterTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("Access_Level") %>'>
</asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Employee ID" SortExpression="Employee_ID">
<EditItemTemplate>
<asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("Employee_ID") %>'>
</asp:TextBox>
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox ID="ftrEmpID" runat="server" Columns="5"></asp:TextBox>
</FooterTemplate>
<ItemTemplate>
<asp:Label ID="Label3" runat="server" Text='<%# Bind("Employee_ID") %>'>
</asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Department" SortExpression="Department">
<EditItemTemplate>
<asp:TextBox ID="TextBox4" runat="server" Text='<%# Bind("Department") %>'>
</asp:TextBox>
</EditItemTemplate>
<FooterTemplate>
<asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="DepartmentsDS"
DataTextField="Department_Name" DataValueField="id"> </asp:DropDownList>
</FooterTemplate>
<ItemTemplate>
<asp:Label ID="Label4" runat="server" Text='<%# Bind("Department") %>'>
</asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Email" SortExpression="Email">
<EditItemTemplate>
<asp:TextBox ID="TextBox5" runat="server" Text='<%# Bind("Email") %>'>
</asp:TextBox>
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox ID="ftrEmail" runat="server" Columns="10"></asp:TextBox>
</FooterTemplate>
<ItemTemplate>
<asp:Label ID="Label5" runat="server" Text='<%# Bind("Email") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Password" SortExpression="Password">
<EditItemTemplate>
<asp:TextBox ID="TextBox6" runat="server" Text='<%# Bind("Password") %>'>
</asp:TextBox>
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox ID="ftrPassword" runat="server" Columns="10" TextMode="Password">
</asp:TextBox>
</FooterTemplate>
<ItemTemplate>
<asp:Label ID="Label6" runat="server" Text='<%# Bind("Password") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="First Name" SortExpression="First_Name">
<EditItemTemplate>
<asp:TextBox ID="TextBox7" runat="server" Text='<%# Bind("First_Name") %>'>
</asp:TextBox>
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox ID="ftrFName" runat="server" Columns="10"></asp:TextBox>
</FooterTemplate>
<ItemTemplate>
<asp:Label ID="Label7" runat="server" Text='<%# Bind("First_Name") %>'>
</asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="MI" SortExpression="MI">
<EditItemTemplate>
<asp:TextBox ID="TextBox8" runat="server" Text='<%# Bind("MI") %>'></asp:TextBox>
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox ID="ftrMI" runat="server" Columns="2"></asp:TextBox>
</FooterTemplate>
<ItemTemplate>
<asp:Label ID="Label8" runat="server" Text='<%# Bind("MI") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Last Name" SortExpression="Last_Name">
<EditItemTemplate>
<asp:TextBox ID="TextBox9" runat="server" Text='<%# Bind("Last_Name") %>'>
</asp:TextBox>
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox ID="ftrLName" runat="server" Columns="10"></asp:TextBox>
</FooterTemplate>
<ItemTemplate>
<asp:Label ID="Label9" runat="server" Text='<%# Bind("Last_Name") %>'>
</asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Phone/Extention" SortExpression="Phone_Extention">
<EditItemTemplate>
<asp:TextBox ID="TextBox10" runat="server" Text='<%# Bind("Phone_Extention") %>'>
</asp:TextBox>
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox ID="ftrPhone" runat="server" Columns="10"></asp:TextBox>
</FooterTemplate>
<ItemTemplate>
<asp:Label ID="Label10" runat="server" Text='<%# Bind("Phone_Extention") %>'>
</asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Notes" InsertVisible="False" SortExpression="Notes">
<EditItemTemplate>
<asp:TextBox ID="TextBox11" runat="server" Text='<%# Bind("Notes") %>'>
</asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label11" runat="server" Text='<%# Bind("Notes") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Admin Notes" InsertVisible="False"
SortExpression="Admin_Notes">
<EditItemTemplate>
<asp:TextBox ID="TextBox12" runat="server" Text='<%# Bind("Admin_Notes") %>'>
</asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label12" runat="server" Text='<%# Bind("Admin_Notes") %>'>
</asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<EditRowStyle BackColor="#999999" />
<FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" Wrap="False" />
<PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
<RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
<SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
</asp:GridView>
接下来是 sqldatasource
。请注意,它有一个插入命令,并且没有使用乐观并发。
<asp:SqlDataSource ID="UsersDS" runat="server"
ConnectionString="<%$ ConnectionStrings:EstimatorConnectionString %>"
DeleteCommand="DELETE FROM [Users] WHERE [id] = @original_id"
InsertCommand="INSERT INTO [Users] ([Company], [Access_Level], [Employee_ID],
[Department], [Email], [Password], [First_Name], [MI], [Last_Name], [Phone_Extention],
[Notes], [Admin_Notes]) VALUES (@Company, @Access_Level, @Employee_ID, @Department,
@Email, @Password, @First_Name, @MI, @Last_Name,
@Phone_Extention, @Notes, @Admin_Notes)"
OldValuesParameterFormatString="original_{0}"
SelectCommand="SELECT [id], [Company], [Access_Level], [Employee_ID], [Department],
[Email], [Password], [First_Name], [MI], [Last_Name], [Phone_Extention], [Notes],
[Admin_Notes] FROM [Users]"
UpdateCommand="UPDATE [Users] SET [Company] = @Company, [Access_Level] = @Access_Level,
[Employee_ID] = @Employee_ID, [Department] = @Department, [Email] = @Email,
[Password] = @Password, [First_Name] = @First_Name,
[MI] = @MI, [Last_Name] = @Last_Name,
[Phone_Extention] = @Phone_Extention, [Notes] = @Notes, [Admin_Notes] = @Admin_Notes
WHERE [id] = @original_id">
<DeleteParameters>
<asp:Parameter Name="original_id" Type="Int32"></asp:Parameter>
</DeleteParameters>
<InsertParameters>
<asp:Parameter Name="Company" Type="Int32"></asp:Parameter>
<asp:Parameter Name="Access_Level" Type="Int32"></asp:Parameter>
<asp:Parameter Name="Employee_ID" Type="String"></asp:Parameter>
<asp:Parameter Name="Department" Type="String"></asp:Parameter>
<asp:Parameter Name="Email" Type="String"></asp:Parameter>
<asp:Parameter Name="Password" Type="String"></asp:Parameter>
<asp:Parameter Name="First_Name" Type="String"></asp:Parameter>
<asp:Parameter Name="MI" Type="String"></asp:Parameter>
<asp:Parameter Name="Last_Name" Type="String"></asp:Parameter>
<asp:Parameter Name="Phone_Extention" Type="String"></asp:Parameter>
<asp:Parameter Name="Notes" Type="String"></asp:Parameter>
<asp:Parameter Name="Admin_Notes" Type="String"></asp:Parameter>
</InsertParameters>
<UpdateParameters>
<asp:Parameter Name="Company" Type="Int32"></asp:Parameter>
<asp:Parameter Name="Access_Level" Type="Int32"></asp:Parameter>
<asp:Parameter Name="Employee_ID" Type="String"></asp:Parameter>
<asp:Parameter Name="Department" Type="String"></asp:Parameter>
<asp:Parameter Name="Email" Type="String"></asp:Parameter>
<asp:Parameter Name="Password" Type="String"></asp:Parameter>
<asp:Parameter Name="First_Name" Type="String"></asp:Parameter>
<asp:Parameter Name="MI" Type="String"></asp:Parameter>
<asp:Parameter Name="Last_Name" Type="String"></asp:Parameter>
<asp:Parameter Name="Phone_Extention" Type="String"></asp:Parameter>
<asp:Parameter Name="Notes" Type="String"></asp:Parameter>
<asp:Parameter Name="Admin_Notes" Type="String"></asp:Parameter>
<asp:Parameter Name="original_id" Type="Int32"></asp:Parameter>
</UpdateParameters>
</asp:SqlDataSource>
现在在代码背后,我们有两个函数。第一个是标准的 OnRowCommand
sub,我们检查命令名称,在本例中是 "ftrInsert
",它是我们分配给 gridview
的页脚行中的插入 linkbutton
的 commandname
,然后我们调用我们的小插入 sub。
Protected Sub GridView1_RowCommand(ByVal sender As System.Object,
ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs)
If e.CommandName = "ftrInsert" Then
'call the insert sub (sender is the gridview that called the rowCommand,
'UsersDS is the name of our sqlDataSource on the page
gvQuickInsert(sender, UsersDS)
End If
End Sub
准备好了吗?这是我们的插入例程。这个小 sub 查找每个字段的 SortExpression
中的所有列名,然后在页脚行中找到与每一行对应的控件。然后它迭代并将每一列添加为 sqlDataSource
插入参数,并附加与之对应的控件的值。最后,它插入到 datasource
并 databind
gridview
。我只定义了 textbox
、dropdownlist
和 checkbox
,因为这就是我所使用的全部,但是如果需要,您可以定义自己的。
Protected Sub gvQuickInsert(ByRef gv As GridView, ByRef ds As SqlDataSource)
Dim paramsArr As ArrayList = New ArrayList
Dim controlsArr As ArrayList = New ArrayList
Dim col As Integer = 0
Dim footrow As GridViewRow = gv.FooterRow
Try
Dim ix As Integer = 0
For ix = 0 To gv.Columns.Count
Dim d As DataControlField = gv.Columns(ix)
If d.InsertVisible = True Then
If footrow.Cells(ix).Controls(1) IsNot Nothing Then
paramsArr.Add(d.SortExpression.ToString)
controlsArr.Add(footrow.Cells(ix).Controls(1))
End If
End If
Next
Catch ex As Exception
End Try
ds.InsertParameters.Clear()
Dim ii As Integer = 0
For Each contr As Object In controlsArr
If contr.GetType.Name.ToLower.Contains("textbox") Then
ds.InsertParameters.Add(paramsArr(ii), TryCast(contr, TextBox).Text)
ElseIf contr.GetType.Name.ToLower.Contains("dropdownlist") Then
ds.InsertParameters.Add(paramsArr(ii), _
TryCast(contr, DropDownList).SelectedValue)
ElseIf contr.GetType.Name.ToLower.Contains("checkbox") Then
If TryCast(contr, CheckBox).Checked Then
ds.InsertParameters.Add(paramsArr(ii), 1)
Else
ds.InsertParameters.Add(paramsArr(ii), 0)
End If
End If
ii = ii + 1
Next
ds.Insert()
gv.DataBind()
End Sub
关注点
这可以为您节省数小时,但它并不完美。您必须允许对所有字段进行排序,并且必须按其默认字段名称进行排序。除此之外,您可以使用它的方式可能没有尽头。
历史
- 2009 年 8 月 30 日:首次发布