我正在使用C#和ASP.net创建网格视图...我需要帮助创建2个网格视图,它们具有相同的processID并从同一数据库中的不同SQL表中获取数据。当我单击第一行的第一行时第一个gridview它应该给我带有相同processID的文件列表及其在第二个gridview中的详细信息
一个进程ID中存储了许多不同的xml文件 例如第一个gridview中的processID = 7A413EA4-8ECE-472D-92BE-F58C22E5C567 所以在第二个表中具有相同processID的用户名,日期,登录日期的所有xml文件都应显示在选择第一个表中的行
这是我到目前为止所做的:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="FS_PS2FS._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>PS2FS Client</title>
</head>
<body bgcolor="lightgrey">
<form id="form1" runat="server">
<div>
<asp:Label ID="heading" runat="server" Font-Bold="True" Font-Names="Times New Roman"
Font-Size="XX-Large" Font-Underline="True" ForeColor="MidnightBlue" Text="PS2FS CLIENT" CssClass="normal" Height="41px" Width="227px" BorderStyle="Outset" BorderWidth="5px"></asp:Label><br />
<br />
<br />
<asp:GridView ID="LOG_GridView" runat="server" AllowPaging="True" AutoGenerateColumns="False"
CellPadding="4" DataSourceID="FS_PS2FS" ForeColor="#333333" Height="300px" Width="943px" HorizontalAlign="Center" CssClass="AlternatingRowStyle" PageSize="6" SelectedIndex="0" OnSelectedIndexChanging="LOG_GridView_SelectedIndexChanging" BorderColor="#999999">
<FooterStyle BackColor="#CCCCCC" Font-Bold="True" ForeColor="Black" CssClass="normal" />
<RowStyle BackColor="#F7F6F3" ForeColor="#333333" HorizontalAlign="Center" VerticalAlign="Middle" CssClass="RowStyle" />
<EditRowStyle HorizontalAlign="Left" VerticalAlign="Middle" CssClass="normal" Font-Names="Cambria" BackColor="#999999" />
<SelectedRowStyle BackColor="#FFFFC0" Font-Bold="True" ForeColor="#333333" BorderStyle="Outset" CssClass="SelectedRowStyle" BorderColor="Yellow" />
<PagerStyle HorizontalAlign="Center" ForeColor="Black" BackColor="#999999" VerticalAlign="Middle" />
<HeaderStyle BackColor="#006699" Font-Bold="True" ForeColor="White" CssClass="HeaderStyle" />
<AlternatingRowStyle BackColor="White" HorizontalAlign="Center" ForeColor="#284775" />
<Columns>
<asp:CommandField HeaderText="Select" ShowSelectButton="True" />
<asp:BoundField DataField="LOG_ProcessId" HeaderText="Process ID" SortExpression="LOG_ProcessId" />
<asp:BoundField DataField="LOG_Id" HeaderText="ID" InsertVisible="False" ReadOnly="True"
SortExpression="LOG_Id" />
<asp:BoundField DataField="LOG_FileName" HeaderText="File Name" SortExpression="LOG_FileName" />
<asp:BoundField DataField="LOG_Date" HeaderText="Date" SortExpression="LOG_Date" />
<asp:BoundField DataField="LOG_Description" HeaderText="Description" SortExpression="LOG_Description" />
<asp:BoundField DataField="LOG_UserId" HeaderText="User ID" SortExpression="LOG_UserId" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="FS_PS2FS" runat="server" ConnectionString="<%$ ConnectionStrings:FreightsmartWebConnection %>"
SelectCommand="SELECT [LOG_Id], [LOG_FileName], [LOG_Description], [LOG_Date], [LOG_ProcessId], [LOG_Details], [LOG_UserId] FROM [FS_LOG_PS2FS] ORDER BY [LOG_Date] DESC">
</asp:SqlDataSource>
<br />
</div>
<asp:SqlDataSource ID="PS2FS_FS" runat="server" ConnectionString="<%$ ConnectionStrings:FreightsmartWebConnection %>"
SelectCommand="SELECT [P2FV_ID], [P2FV_MessageType], [P2FV_MessageText], [P2FV_FileName], [P2FV_ProcessId], [P2FV_CreateDate], [P2FV_CreateUser] FROM [FS_LOG_PS2FS_Validation] ORDER BY [P2FV_CreateDate] DESC">
</asp:SqlDataSource>
<asp:GridView ID="LogValidation_GridView" runat="server" AutoGenerateColumns="False" CellPadding="4"
DataSourceID="PS2FS_FS" ForeColor="#333333" Height="300px" Width="940px" AllowPaging="True" HorizontalAlign="Center" PageSize="6" OnRowUpdated="LogValidation_GridView_RowUpdated" BorderColor="#999999">
<FooterStyle BackColor="#CCCCCC" Font-Bold="True" ForeColor="Black" CssClass="normal" />
<Columns>
<asp:BoundField DataField="P2FV_ProcessId" HeaderText="Process ID" SortExpression="P2FV_ProcessId" Visible="False" />
<asp:BoundField DataField="P2FV_ID" HeaderText="ID" InsertVisible="False" ReadOnly="True"
SortExpression="P2FV_ID" />
<asp:BoundField DataField="P2FV_MessageType" HeaderText="Message Type" SortExpression="P2FV_MessageType" />
<asp:BoundField DataField="P2FV_MessageText" HeaderText="Message Text" SortExpression="P2FV_MessageText" />
<asp:BoundField DataField="P2FV_FileName" HeaderText="File Name" SortExpression="P2FV_FileName" />
<asp:BoundField DataField="P2FV_CreateDate" HeaderText="Create Date" SortExpression="P2FV_CreateDate" />
<asp:BoundField DataField="P2FV_CreateUser" HeaderText="Create User" SortExpression="P2FV_CreateUser" />
</Columns>
<RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
<SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" BorderStyle="Outset" CssClass="normal" Wrap="True" />
<PagerStyle HorizontalAlign="Center" ForeColor="Black" BackColor="#999999" />
<HeaderStyle BackColor="#006699" Font-Bold="True" ForeColor="White" />
<AlternatingRowStyle BackColor="White" ForeColor="#284775" />
<EditRowStyle BackColor="#999999" />
</asp:GridView>
</form>
答案 0 :(得分:0)
您可以通过以下方式执行此操作:
当您从网格1中单击一行时,您应该在代码隐藏文件上触发一个事件(请查看下面显示的SelectedIndexChanged)。在此事件中,您应查询XML文件表以查找在网格1上选择的行具有相同进程ID的那些。使用此类查询的结果将其绑定到网格2。
void LOG_GridView_SelectedIndexChanged(Object sender, EventArgs e)
{
// Get the currently selected row using the SelectedRow property.
GridViewRow row = CustomersGridView.SelectedRow;
// Do your logic here to query and databind to Grid 2...
}
在Grid1声明中写下:
<asp:GridView ID="LOG_GridView" runat="server" AllowPaging="True" AutoGenerateColumns="False"
CellPadding="4" DataSourceID="FS_PS2FS" ForeColor="#333333" Height="300px" Width="943px" HorizontalAlign="Center" CssClass="AlternatingRowStyle" PageSize="6" SelectedIndex="0" OnSelectedIndexChanging="LOG_GridView_SelectedIndexChanging" BorderColor="#999999" onselectedindexchanged="LOG_GridView_SelectedIndexChanged">
有关GridView事件的更多信息,请查看MSDN上的这些页面:
答案 1 :(得分:0)
基本上你想要创建一个主/细节屏幕......这是这个功课吗?在任何情况下,您都希望将事件(已更改选定的索引)添加到第一个网格。然后在那里添加代码来设置数据源或“过滤”第二个网格中的数据,如果还没有,你可能还会选择在此时看到第二个网格。
第二个网格的数据源需要一个“WHERE”子句,它将比较数据源中的processID和第一个网格中选择的processID。您可以将第一个网格的数据键设置为此字段(processID)以便于检索。
祝你好运!答案 2 :(得分:0)
您应该可以通过标记完成所有操作。以下是使用Northwind数据库的工作示例
定义主GridView:
<asp:GridView ID="master" runat="server" DataSourceID="sdsMaster"
AutoGenerateColumns="False" DataKeyNames="OrderID" AllowPaging="True" >
<Columns>
<asp:CommandField ShowSelectButton="True" />
<asp:BoundField DataField="OrderID" HeaderText="OrderID" InsertVisible="False"
ReadOnly="True" SortExpression="OrderID" />
<asp:BoundField DataField="CustomerID" HeaderText="CustomerID"
SortExpression="CustomerID" />
<asp:BoundField DataField="EmployeeID" HeaderText="EmployeeID"
SortExpression="EmployeeID" />
<asp:BoundField DataField="OrderDate" HeaderText="OrderDate"
SortExpression="OrderDate" />
<asp:BoundField DataField="RequiredDate" HeaderText="RequiredDate"
SortExpression="RequiredDate" />
<asp:BoundField DataField="ShippedDate" HeaderText="ShippedDate"
SortExpression="ShippedDate" />
<asp:BoundField DataField="ShipVia" HeaderText="ShipVia"
SortExpression="ShipVia" />
<asp:BoundField DataField="Freight" HeaderText="Freight"
SortExpression="Freight" />
</Columns>
</asp:GridView>
定义GridView的详细信息:
<asp:GridView ID="detail" runat="server" DataSourceID="sdsDetail"
AutoGenerateColumns="False" DataKeyNames="OrderID,ProductID" >
<Columns>
<asp:BoundField DataField="OrderID" HeaderText="OrderID" ReadOnly="True"
SortExpression="OrderID" />
<asp:BoundField DataField="ProductID" HeaderText="ProductID" ReadOnly="True"
SortExpression="ProductID" />
<asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice"
SortExpression="UnitPrice" />
<asp:BoundField DataField="Quantity" HeaderText="Quantity"
SortExpression="Quantity" />
<asp:BoundField DataField="Discount" HeaderText="Discount"
SortExpression="Discount" />
</Columns>
</asp:GridView>
这是主表的SqlDataSource。只是选择和显示记录的基本内容:
<asp:SqlDataSource ID="sdsMaster" runat="server"
ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
SelectCommand="SELECT [OrderID], [CustomerID], [EmployeeID], [OrderDate], [RequiredDate], [ShippedDate], [ShipVia], [Freight] FROM [Orders]" />
现在在SqlDataSource的详细信息中,使用绑定到主GridView中所选主键的SQL where子句:
<asp:SqlDataSource ID="sdsDetail" runat="server"
ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
SelectCommand="SELECT [OrderID], [ProductID], [UnitPrice], [Quantity], [Discount] FROM [Order Details] WHERE ([OrderID] = @OrderID)" >
<SelectParameters>
<asp:ControlParameter ControlID="master" DefaultValue="0" Name="OrderID"
PropertyName="SelectedValue" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
注意SelectParameters和ControlParameter的使用,它在主GridView中查找所选记录的数据键。
修改强> 由于您使用自己的数据库具有不同的字段名称,因此相应地修改SQL。
FROM [FS_LOG_PS2FS_Validation] WHERE ([P2FV_ProcessId] = @LOG_ProcessId)
并更改SelectParameter
<SelectParameters>
<asp:ControlParameter ControlID="master" DefaultValue="0" Name="LOG_ProcessId"
PropertyName="SelectedValue" Type="Int32" />
</SelectParameters>
此外,您需要在主GridView中设置DataKeyNames属性
<asp:GridView ID="master" runat="server" DataSourceID="sdsMaster"
AutoGenerateColumns="False" DataKeyNames="LOG_ProcessID" AllowPaging="True" >
<Columns>
我认为您不需要设置详细GridView的DataKeyNames。您也可以在那里更改它以获得完整性。我在Visual Studio 2008设计视图中使用了智能标记来生成示例代码。如果不清楚,请告诉我。
编辑2 以下是一些描述配置ASP.NET数据控件的链接。
Master/Detail Using a Selectable Master GridView with a Details DetailView