我在gridview的“ ItemTemplate”中有一个gridview。外部gridview(gvPOs)具有“选择”选项。由于我的sql数据源是通过后面的代码处理的,而不是通过设计模式通过sqldatasource处理的,因此没有“启用选择”,“启用删除”等。因此,我在“编辑列”下添加了select作为CommandField。通常,当gridview本身是一个,而我使用表数据显示一个formview来显示该信息时,我只需填写where子句以显示ID来自gvPOs.SelectedValue控件的位置,它将显示该特定行。但是在这种情况下,由于存在嵌套的gridview,出于某种原因,当我这样做时,“选择”什么也没做。
我正在尝试在外部gridview的最右列上进行选择,以打开与PO_ID对应的formview。
左侧只是为了显示它在做什么。单击左侧的扩展按钮时,第二个网格视图会弹出,其中包含具有该PO_ID的记录。我的总体目标是能够从两个表中添加,删除和编辑记录。
后面的代码:
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Configuration;
namespace PO_1_5_15
{
public partial class _Webform : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
gvPOs.DataSource = GetData("select * from dbo.po_table");
gvPOs.DataBind();
FormView1.Visible = false;
}
}
protected void gvTasks_RowDataBound(Object sender, GridViewRowEventArgs e)
{
gvPOs.DataBind();
}
private static DataTable GetData(string query)
{
string constr = ConfigurationManager.ConnectionStrings["Test_DatabaseConnectionString3"].ConnectionString;
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.CommandText = query;
using (SqlDataAdapter sda = new SqlDataAdapter())
{
cmd.Connection = con;
sda.SelectCommand = cmd;
using (DataSet ds = new DataSet())
{
DataTable dt = new DataTable();
sda.Fill(dt);
return dt;
}
}
}
}
}
protected void Show_Hide_ChildGrid(object sender, EventArgs e)
{
ImageButton imgShowHide = (sender as ImageButton);
GridViewRow row = (imgShowHide.NamingContainer as GridViewRow);
if (imgShowHide.CommandArgument == "Show")
{
row.FindControl("pnlTasks").Visible = true;
imgShowHide.CommandArgument = "Hide";
imgShowHide.ImageUrl = "~/images/minus.png";
string POId = gvPOs.DataKeys[row.RowIndex].Value.ToString();
GridView gvTasks = row.FindControl("gvTasks") as GridView; gvTasks.ToolTip = POId;
gvTasks.DataSource = GetData(string.Format("select * from task where po_Id='{0}'", POId));
gvTasks.DataBind();
}
else
{
row.FindControl("pnlTasks").Visible = false;
imgShowHide.CommandArgument = "Show";
imgShowHide.ImageUrl = "~/images/plus.png";
}
}
private void BindTasks(string POId, GridView gvTasks)
{
gvTasks.ToolTip = POId;
gvTasks.DataSource = GetData(string.Format("select * from task where po_Id='{0}'", POId));
gvTasks.DataBind();
}
protected void OnChildGrid_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView gvTasks = (sender as GridView);
gvTasks.PageIndex = e.NewPageIndex;
BindTasks(gvTasks.ToolTip, gvTasks);
}
protected void Button1_Click(object sender, EventArgs e)
{
FormView1.Visible = true;
// FormView2.Visible = false;
}
protected void Button2_Click(object sender, EventArgs e)
{
// FormView2.Visible = true;
FormView1.Visible = false;
}
protected void FormView1_PageIndexChanging(object sender, FormViewPageEventArgs e)
{
gvPOs.DataBind();
}
protected void gvTasks_SelectedIndexChanged(object sender, EventArgs e)
{
gvPOs.DataBind();
}
}
}
HTML标记:
<%@ Page Language="C#" EnableEventValidation="false" AutoEventWireup="true" CodeBehind="Webform.aspx.cs" Inherits="PO_1_5_15._Webform" %>
<%@ Register assembly="System.Web.Entity, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" namespace="System.Web.UI.WebControls" tagprefix="asp" %>
<!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></title>
<style type="text/css">
.ChildGrid {
margin-right: 2px;
}
.Grid {
margin-right: 30px;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Add PO" />
<br />
<asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="Add Task" />
<br />
<asp:GridView ID="gvPOs" runat="server" AutoGenerateColumns="False" CssClass="Grid"
DataKeyNames="PO_ID" EnableModelValidation="True" >
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:ImageButton ID="imgShow" runat="server" OnClick="Show_Hide_ChildGrid" ImageUrl="~/images/plus.png"
CommandArgument="Show" />
<asp:Panel ID="pnlTasks" runat="server" Visible="false" Style="position: relative">
<asp:GridView ID="gvTasks" runat="server" AutoGenerateColumns="False" PageSize="5"
AllowPaging="True" OnPageIndexChanging="OnChildGrid_PageIndexChanging" CssClass="ChildGrid" EnableModelValidation="True">
<Columns>
<asp:BoundField ItemStyle-Width="150px" DataField="PO_ID" HeaderText="PO #" >
<ItemStyle Width="150px" />
</asp:BoundField>
<asp:BoundField ItemStyle-Width="150px" DataField="Invoice_No" HeaderText="Invoice #" >
<ItemStyle Width="150px" />
</asp:BoundField>
<asp:BoundField ItemStyle-Width="150px" DataField="Invoice_Date" HeaderText="Invoice Date" >
<ItemStyle Width="150px" />
</asp:BoundField>
<asp:BoundField ItemStyle-Width="150px" DataField="Task_Note" HeaderText="Task Note" >
<ItemStyle Width="150px" />
</asp:BoundField>
<asp:BoundField ItemStyle-Width="150px" DataField="Username" HeaderText="Username" >
<ItemStyle Width="150px" />
</asp:BoundField>
<asp:BoundField ItemStyle-Width="150px" DataField="UserDate" HeaderText="Current Date/Time" >
<ItemStyle Width="150px" />
</asp:BoundField>
<asp:BoundField ItemStyle-Width="150px" DataField="_Status" HeaderText="Status" >
<ItemStyle Width="150px" />
</asp:BoundField>
<asp:BoundField ItemStyle-Width="150px" DataField="Cost" HeaderText="Cost" >
<ItemStyle Width="150px" />
</asp:BoundField>
<asp:BoundField ItemStyle-Width="150px" DataField="Services" HeaderText="Service" >
<ItemStyle Width="150px" />
</asp:BoundField>
<asp:CommandField ShowSelectButton="True" />
</Columns>
</asp:GridView>
</asp:Panel>
<br />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField ItemStyle-Width="150px" DataField="PO_ID" HeaderText="PO #" >
<ItemStyle Width="150px"></ItemStyle>
</asp:BoundField>
<asp:BoundField ItemStyle-Width="150px" DataField="Invoice_No" HeaderText="Invoice #" >
<ItemStyle Width="150px"></ItemStyle>
</asp:BoundField>
<asp:BoundField ItemStyle-Width="150px" DataField="Username" HeaderText="Username" >
<ItemStyle Width="150px"></ItemStyle>
</asp:BoundField>
<asp:BoundField ItemStyle-Width="150px" DataField="UserDate" HeaderText="Current Date/Time" >
<ItemStyle Width="150px"></ItemStyle>
</asp:BoundField>
<asp:BoundField ItemStyle-Width="150px" DataField="PO_Note" HeaderText="PO Note" >
<ItemStyle Width="150px"></ItemStyle>
</asp:BoundField>
<asp:CommandField ShowSelectButton="True" />
</Columns>
</asp:GridView>
<br />
<asp:FormView ID="FormView1" runat="server" DataKeyNames="PO_AutoID" DataSourceID="SqlDataSource1" EnableModelValidation="True" OnPageIndexChanging="FormView1_PageIndexChanging">
<EditItemTemplate>
PO_AutoID:
<asp:Label ID="PO_AutoIDLabel1" runat="server" Text='<%# Eval("PO_AutoID") %>' />
<br />
PO_ID:
<asp:TextBox ID="PO_IDTextBox" runat="server" Text='<%# Bind("PO_ID") %>' />
<br />
PO_Title:
<asp:TextBox ID="PO_TitleTextBox" runat="server" Text='<%# Bind("PO_Title") %>' />
<br />
Date_Received:
<asp:TextBox ID="Date_ReceivedTextBox" runat="server" Text='<%# Bind("Date_Received") %>' />
<br />
Date_Completed:
<asp:TextBox ID="Date_CompletedTextBox" runat="server" Text='<%# Bind("Date_Completed") %>' />
<br />
Username:
<asp:TextBox ID="UsernameTextBox" runat="server" Text='<%# Bind("Username") %>' />
<br />
UserDate:
<asp:TextBox ID="UserDateTextBox" runat="server" Text='<%# Bind("UserDate") %>' />
<br />
PO_Note:
<asp:TextBox ID="PO_NoteTextBox" runat="server" Text='<%# Bind("PO_Note") %>' />
<br />
Department:
<asp:TextBox ID="DepartmentTextBox" runat="server" Text='<%# Bind("Department") %>' />
<br />
Invoice_No:
<asp:TextBox ID="Invoice_NoTextBox" runat="server" Text='<%# Bind("Invoice_No") %>' />
<br />
<asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update" Text="Update" />
<asp:LinkButton ID="UpdateCancelButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel" />
</EditItemTemplate>
<InsertItemTemplate>
PO_ID:
<asp:TextBox ID="PO_IDTextBox" runat="server" Text='<%# Bind("PO_ID") %>' />
<br />
PO_Title:
<asp:TextBox ID="PO_TitleTextBox" runat="server" Text='<%# Bind("PO_Title") %>' />
<br />
Date_Received:
<asp:TextBox ID="Date_ReceivedTextBox" runat="server" Text='<%# Bind("Date_Received") %>' />
<br />
Date_Completed:
<asp:TextBox ID="Date_CompletedTextBox" runat="server" Text='<%# Bind("Date_Completed") %>' />
<br />
Username:
<asp:TextBox ID="UsernameTextBox" runat="server" Text='<%# Bind("Username") %>' />
<br />
UserDate:
<asp:TextBox ID="UserDateTextBox" runat="server" Text='<%# Bind("UserDate") %>' />
<br />
PO_Note:
<asp:TextBox ID="PO_NoteTextBox" runat="server" Text='<%# Bind("PO_Note") %>' />
<br />
Department:
<asp:TextBox ID="DepartmentTextBox" runat="server" Text='<%# Bind("Department") %>' />
<br />
Invoice_No:
<asp:TextBox ID="Invoice_NoTextBox" runat="server" Text='<%# Bind("Invoice_No") %>' />
<br />
<asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" CommandName="Insert" Text="Insert" />
<asp:LinkButton ID="InsertCancelButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel" />
</InsertItemTemplate>
<ItemTemplate>
PO_AutoID:
<asp:Label ID="PO_AutoIDLabel" runat="server" Text='<%# Eval("PO_AutoID") %>' />
<br />
PO_ID:
<asp:Label ID="PO_IDLabel" runat="server" Text='<%# Bind("PO_ID") %>' />
<br />
PO_Title:
<asp:Label ID="PO_TitleLabel" runat="server" Text='<%# Bind("PO_Title") %>' />
<br />
Date_Received:
<asp:Label ID="Date_ReceivedLabel" runat="server" Text='<%# Bind("Date_Received") %>' />
<br />
Date_Completed:
<asp:Label ID="Date_CompletedLabel" runat="server" Text='<%# Bind("Date_Completed") %>' />
<br />
Username:
<asp:Label ID="UsernameLabel" runat="server" Text='<%# Bind("Username") %>' />
<br />
UserDate:
<asp:Label ID="UserDateLabel" runat="server" Text='<%# Bind("UserDate") %>' />
<br />
PO_Note:
<asp:Label ID="PO_NoteLabel" runat="server" Text='<%# Bind("PO_Note") %>' />
<br />
Department:
<asp:Label ID="DepartmentLabel" runat="server" Text='<%# Bind("Department") %>' />
<br />
Invoice_No:
<asp:Label ID="Invoice_NoLabel" runat="server" Text='<%# Bind("Invoice_No") %>' />
<br />
<asp:LinkButton ID="EditButton" runat="server" CausesValidation="False" CommandName="Edit" Text="Edit" />
<asp:LinkButton ID="DeleteButton" runat="server" CausesValidation="False" CommandName="Delete" Text="Delete" />
<asp:LinkButton ID="NewButton" runat="server" CausesValidation="False" CommandName="New" Text="New" />
</ItemTemplate>
</asp:FormView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:Test_DatabaseConnectionString3 %>" SelectCommand="SELECT * FROM [PO_Table] WHERE ([PO_ID] = @PO_ID)" DeleteCommand="DELETE FROM [PO_Table] WHERE [PO_AutoID] = @PO_AutoID" InsertCommand="INSERT INTO [PO_Table] ([PO_ID], [PO_Title], [Date_Received], [Date_Completed], [Username], [UserDate], [PO_Note], [Department], [Invoice_No]) VALUES (@PO_ID, @PO_Title, @Date_Received, @Date_Completed, @Username, @UserDate, @PO_Note, @Department, @Invoice_No)" UpdateCommand="UPDATE [PO_Table] SET [PO_ID] = @PO_ID, [PO_Title] = @PO_Title, [Date_Received] = @Date_Received, [Date_Completed] = @Date_Completed, [Username] = @Username, [UserDate] = @UserDate, [PO_Note] = @PO_Note, [Department] = @Department, [Invoice_No] = @Invoice_No WHERE [PO_AutoID] = @PO_AutoID">
<DeleteParameters>
<asp:Parameter Name="PO_AutoID" Type="Int32" />
</DeleteParameters>
<InsertParameters>
<asp:Parameter Name="PO_ID" Type="Int32" />
<asp:Parameter Name="PO_Title" Type="String" />
<asp:Parameter Name="Date_Received" Type="DateTime" />
<asp:Parameter Name="Date_Completed" Type="DateTime" />
<asp:Parameter Name="Username" Type="String" />
<asp:Parameter Name="UserDate" Type="DateTime" />
<asp:Parameter Name="PO_Note" Type="String" />
<asp:Parameter Name="Department" Type="String" />
<asp:Parameter Name="Invoice_No" Type="String" />
</InsertParameters>
<SelectParameters>
<asp:ControlParameter ControlID="gvPOs" Name="PO_ID" PropertyName="SelectedValue" Type="Int32" />
</SelectParameters>
<UpdateParameters>
<asp:Parameter Name="PO_ID" Type="Int32" />
<asp:Parameter Name="PO_Title" Type="String" />
<asp:Parameter Name="Date_Received" Type="DateTime" />
<asp:Parameter Name="Date_Completed" Type="DateTime" />
<asp:Parameter Name="Username" Type="String" />
<asp:Parameter Name="UserDate" Type="DateTime" />
<asp:Parameter Name="PO_Note" Type="String" />
<asp:Parameter Name="Department" Type="String" />
<asp:Parameter Name="Invoice_No" Type="String" />
<asp:Parameter Name="PO_AutoID" Type="Int32" />
</UpdateParameters>
</asp:SqlDataSource>
<br />
<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:Test_DatabaseConnectionString3 %>" DeleteCommand="DELETE FROM [Task] WHERE [Task_AutoID] = @Task_AutoID" InsertCommand="INSERT INTO [Task] ([PO_AutoID], [PO_ID], [Task_Title], [Username], [UserDate], [Cost], [_Status], [Invoice_Date], [Paid_Date], [Task_Note], [Department], [Invoice_No], [Services]) VALUES (@PO_AutoID, @PO_ID, @Task_Title, @Username, @UserDate, @Cost, @column1, @Invoice_Date, @Paid_Date, @Task_Note, @Department, @Invoice_No, @Services)" SelectCommand="SELECT * FROM [Task]" UpdateCommand="UPDATE [Task] SET [PO_AutoID] = @PO_AutoID, [PO_ID] = @PO_ID, [Task_Title] = @Task_Title, [Username] = @Username, [UserDate] = @UserDate, [Cost] = @Cost, [_Status] = @column1, [Invoice_Date] = @Invoice_Date, [Paid_Date] = @Paid_Date, [Task_Note] = @Task_Note, [Department] = @Department, [Invoice_No] = @Invoice_No, [Services] = @Services WHERE [Task_AutoID] = @Task_AutoID">
<DeleteParameters>
<asp:Parameter Name="Task_AutoID" Type="Int32" />
</DeleteParameters>
<InsertParameters>
<asp:Parameter Name="PO_AutoID" Type="Int32" />
<asp:Parameter Name="PO_ID" Type="Int32" />
<asp:Parameter Name="Task_Title" Type="String" />
<asp:Parameter Name="Username" Type="String" />
<asp:Parameter Name="UserDate" Type="DateTime" />
<asp:Parameter Name="Cost" Type="Decimal" />
<asp:Parameter Name="column1" Type="String" />
<asp:Parameter Name="Invoice_Date" Type="DateTime" />
<asp:Parameter Name="Paid_Date" Type="DateTime" />
<asp:Parameter Name="Task_Note" Type="String" />
<asp:Parameter Name="Department" Type="String" />
<asp:Parameter Name="Invoice_No" Type="String" />
<asp:Parameter Name="Services" Type="String" />
</InsertParameters>
<UpdateParameters>
<asp:Parameter Name="PO_AutoID" Type="Int32" />
<asp:Parameter Name="PO_ID" Type="Int32" />
<asp:Parameter Name="Task_Title" Type="String" />
<asp:Parameter Name="Username" Type="String" />
<asp:Parameter Name="UserDate" Type="DateTime" />
<asp:Parameter Name="Cost" Type="Decimal" />
<asp:Parameter Name="column1" Type="String" />
<asp:Parameter Name="Invoice_Date" Type="DateTime" />
<asp:Parameter Name="Paid_Date" Type="DateTime" />
<asp:Parameter Name="Task_Note" Type="String" />
<asp:Parameter Name="Department" Type="String" />
<asp:Parameter Name="Invoice_No" Type="String" />
<asp:Parameter Name="Services" Type="String" />
<asp:Parameter Name="Task_AutoID" Type="Int32" />
</UpdateParameters>
</asp:SqlDataSource>
<br />
<br />
</div>
</form>
</body>
</html>
我无法100%理解您的问题。如果要使用嵌套的GridView,请在父GridView的Row_DataBound事件中绑定子GridView。确保在if(!Page.IsPostBack)条件内绑定父Gridview,因此一旦按下选择按钮,它将不会绑定父GridView。