65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Gridview 快速插入行, 无需控件命名

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (4投票s)

2009年8月30日

CPOL

3分钟阅读

viewsIcon

36924

如果您讨厌在 gridview 的页脚行中命名控件以进行插入,那么这篇文章就是为您准备的。

引言

这段小代码可以轻松地将行插入到绑定到 sqldatasourcegridview 中。

背景

我讨厌...我是说讨厌在我的 gridview 的页脚行中放置和命名控件,以便我可以进行插入。我更讨厌的是使用 findcontrol("controlname") 查找页脚行中的所有控件,清除 sqlDatasources 插入参数,然后使用我刚刚创建的页脚中控件的值一次添加一个。这看起来很荒谬。所以我本周正在做一个项目,该项目实际上有 27 个需要允许插入的 gridview。好的,所以我可以使用 detailsview 控件,但这太耗时了,而且看起来不太好,我只想让用户输入、选择或选中一些值,单击插入链接,然后完成工作。

是的,我可以将字段放在网格视图下面的表中,我知道,但我也讨厌那样。所以这是我想出的解决方案,我敢打赌你们中的一些人会很高兴拥有它。我花了大约 6 个小时才弄清楚,但是现在在我想要允许插入的每个 gridview 上实施它大约需要 5 分钟。

Using the Code

让我们从我们的 gridview 开始。这是一个很大的示例来演示这一点,尽管一个小的两个字段也可以很好地工作。首先要注意的是,每个字段的 SortExpression 都设置为 datasource 中相应字段的名称。如果您必须进行某种其他类型的排序,或者您不希望用户能够按所有字段进行排序,那么这将不适用于您,您必须采用较长的方式......对不起。

另请注意,已设置 OnRowCommadShowFootertrue 并且 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 的页脚行中的插入 linkbuttoncommandname,然后我们调用我们的小插入 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 插入参数,并附加与之对应的控件的值。最后,它插入到 datasourcedatabind gridview。我只定义了 textboxdropdownlistcheckbox,因为这就是我所使用的全部,但是如果需要,您可以定义自己的。

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 日:首次发布
© . All rights reserved.