Использовать значения выбранной строки из вложенного Gridview для заполнения другого Gridview

#c# #gridview

#c# #gridview

Вопрос:

Кто-нибудь знает, как это преодолеть? Любая помощь приветствуется

Я создал вложенный gridview, используя эту впечатляющую СТАТЬЮ вложенный gridview отлично работает, как и в статье. Теперь я хочу добавить на страницу отдельный третий gridview (OuterGridView), НО НЕ вложенный в gvParent или gvChild. Когда я выбираю строку из gvChild, я хочу передать OrderID и EmployeeID выбранной строки пользовательскому методу (BindOuterGridView) для запроса базы данных и отображения результата во внешнем GridView.

До сих пор мне не удалось заполнить OuterGridView

Вот мой код

 using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Web;
using System.Web.UI;
using System.Web.Configuration;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
string _connectionString;
DataTable customersTable = null;
DataTable orderTable = null;
DataTable orderDetailTable = null;

protected void Page_Load(object sender, EventArgs e)
{
    gvParent.DataSource = GetParentTableData();       
    gvParent.DataBind();

    if (!Page.IsPostBack)
    {
        GridViewChildPageIndex();          
    }     
}
private string GetConnectionString()
{
    _connectionString = WebConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString;

    return _connectionString;
}

// gets data for the parent Gridview i.e.( gvParent)
private DataTable GetParentTableData()
{
    customersTable = new DataTable("Customers");
    string constr = GetConnectionString();
    string query = "SELECT top 10 [CustomerID],[CompanyName],[ContactName],[ContactTitle],[Phone] FROM [Northwind].[dbo].[Customers]";
    SqlConnection con = new SqlConnection(constr);
    SqlCommand cmd = new SqlCommand(query, con);
    using (con)
    {
        con.Open();
        SqlDataReader reader = cmd.ExecuteReader();
        customersTable.Load(reader);
    }
    return customersTable;
}

// gets data for the child Gridview i.e.( gvChile)
private DataTable GetChildTableData(string custID)
{
    orderTable = new DataTable("Orders");
    string constr = GetConnectionString();
    string query = "select OrderID,CustomerID,EmployeeID,OrderDate,RequiredDate from dbo.Orders where CustomerID= '"   custID   "'";
    SqlConnection con = new SqlConnection(constr);
    SqlCommand cmd = new SqlCommand(query, con);
    using (con)
    {
        con.Open();
        SqlDataReader reader = cmd.ExecuteReader();
        orderTable.Load(reader);
    }
    return orderTable;
}

protected void gvParent_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {


        Image img = (Image)e.Row.Cells[0].FindControl("img1");
        Literal ltrl = (Literal)e.Row.FindControl("lit1");
        ltrl.Text = ltrl.Text.Replace("trCollapseGrid", "trCollapseGrid"   e.Row.RowIndex.ToString());
        string str = "trCollapseGrid"   e.Row.RowIndex.ToString();
        e.Row.Cells[0].Attributes.Add("OnClick", "OpenTable('"   str   "','"   img.ClientID   "')");
        e.Row.Cells[0].RowSpan = 1;
        System.Web.UI.WebControls.GridView gvChild = (System.Web.UI.WebControls.GridView)e.Row.FindControl("gvChild");

        if (Session["ChildPageIndex"] != null)
        {
            DataTable dtPageIndex = (DataTable)Session["ChildPageIndex"];
            gvChild.PageIndex = Convert.ToInt16(dtPageIndex.Rows[e.Row.RowIndex][0]);

        }

        BindChildGrdView(gvParent.DataKeys[e.Row.RowIndex].Value.ToString(), gvChild);
    }
}

protected void gvChild_PageIndexChanging(object sender, GridViewPageEventArgs e)
{        
    System.Web.UI.WebControls.GridView gvwChild = ((System.Web.UI.WebControls.GridView)sender);
    GridViewRow gvRowParent = ((System.Web.UI.WebControls.GridView)sender).Parent.Parent as GridViewRow;

    gvwChild.PageIndex = e.NewPageIndex;
    if (Session["ChildPageIndex"] != null)
    {
        DataTable dtPageIndex = (DataTable)Session["ChildPageIndex"];
        dtPageIndex.Rows[gvRowParent.RowIndex][0] = e.NewPageIndex;
    }
    BindChildGrdView(gvParent.DataKeys[gvRowParent.RowIndex].Value.ToString(), gvwChild);

    if (!ClientScript.IsStartupScriptRegistered("alert"))
    {
        ScriptManager.RegisterStartupScript(Page, Page.GetType(), "alert", "document.getElementById('"   hidRowId.Value   "').style.display = '';", true);
    }

}

//Dynamically create bing gvChil
private void BindChildGrdView(string custId, System.Web.UI.WebControls.GridView gvChild)
{
    DataTable dtChildTable = GetChildTableData(custId);
    DataTable dtCloneChildTable = dtChildTable.Clone();
    DataRow[] gvChildRows = dtChildTable.Select();
    foreach (DataRow gvChildRow in gvChildRows)
    {
        dtCloneChildTable.ImportRow(gvChildRow);
    }
    gvChild.DataSource = dtCloneChildTable;
    gvChild.AllowPaging = true;
    gvChild.PageSize = 15;
    gvChild.DataBind();      

}

private void GridViewChildPageIndex()
{
    DataTable dtPageIndex = new DataTable();
    dtPageIndex.Columns.Add("PageIndex", typeof(int));
    for (int i = 0; i < gvParent.Rows.Count; i  )
    {
        dtPageIndex.Rows.Add("0");
    }
    Session["ChildPageIndex"] = dtPageIndex;
}

// gets data for the outer Gridview i.e.( OuterGridView)
private DataTable BindOuterGridView(string orderId, string EmployeeId)
{
    orderDetailTable = new DataTable("OrderDetails");
    string constr = GetConnectionString();
    string query = "SELECT [Order Details].OrderID, [Order Details].UnitPrice, [Order   Details].Quantity,Employees.FirstName  ' '  Employees.LastName as EmlpoyeeName, Orders.EmployeeID FROM Northwind.dbo.Orders INNER JOIN [Order Details] ON [Order Details].OrderID=Orders.OrderID INNER JOIN Employees ON Employees.EmployeeID=Orders.EmployeeID WHERE dbo.Orders.OrderID ='" orderId "'" " AND dbo.Orders.EmployeeID='" EmployeeId  "'";
    SqlConnection con = new SqlConnection(constr);
    SqlCommand cmd = new SqlCommand(query, con);
    using (con)
    {
        con.Open();
        SqlDataReader reader = cmd.ExecuteReader();
        orderDetailTable.Load(reader);
    }       
    return orderDetailTable;
}

//when I select a row from gvChild  I grab the OrderID and EmployeeId
//and passed to BindOuterGridView method to populate OuterGridView 
protected void gvChild_RowCommand(object sender,   System.Web.UI.WebControls.GridViewCommandEventArgs e)
{

if (e.CommandName.ToLower() == "select") {

    GridView grd = (GridView)sender;
    LinkButton lb = (LinkButton)e.CommandSource;
    GridViewRow gvRow = (GridViewRow)lb.BindingContainer;         
    string orderID =grd.DataKeys[gvRow.RowIndex].Values[0].ToString();
    string employeeID = grd.DataKeys[gvRow.RowIndex].Values[1].ToString();

    OuterGridView.DataSource = BindOuterGridView(orderID, employeeID);
    OuterGridView.DataBind();

}
}
}    
  

html-скрипт

 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" 
Inherits="_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></title>
</head>
<body>
 <form id="form1" runat="server">
 <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
 </asp:ScriptManager>
 <script language="javascript" type="text/javascript">
  function OpenTable(trRow, imgId) {
        object = document.getElementById(trRow);
        var rowId = document.getElementById('<%=hidRowId.ClientID %>').value;
        var imageId = document.getElementById('<%=hidImgId.ClientID %>').value;

        if (rowId != '') {
            if (document.getElementById('<%=hidImgId.ClientID %>').value != imgId) {
                document.getElementById(rowId).style.display = "none";
                document.getElementById(imageId).src = "img/Collapse.gif";
            }
        }
        document.getElementById('<%=hidImgId.ClientID %>').value = imgId;
        document.getElementById('<%=hidRowId.ClientID %>').value = trRow;
        if (object.style.display == "none") {
            object.style.display = "";
            document.getElementById(imgId).src = "img/Expand.gif";
        }
        else {
            object.style.display = "none";
            document.getElementById(imgId).src = "img/Collapse.gif";
        }
    }

</script>
<div style="height: 20px; color: red;">
    <asp:UpdateProgress runat="server" ID="PageUpdateProgress">
        <ProgressTemplate>
            <img src="img/processing.gif" alt="Processing" />
            Processing please wait......
        </ProgressTemplate>
    </asp:UpdateProgress>
</div>
<asp:UpdatePanel runat="server" ID="updTest">
    <ContentTemplate>
        <asp:GridView ID="gvParent" runat="server" DataKeyNames="CustomerID" AutoGenerateColumns="False"
            OnRowDataBound="gvParent_RowDataBound" CellPadding="4" ForeColor="#333333" ShowHeader="True">
            <Columns>
                <asp:TemplateField ItemStyle-Width="20px">
                    <ItemTemplate>
                        <asp:Image runat="server" ID="img1" ImageUrl="~/img/Collapse.GIF" />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField HeaderText="Customer ID" DataField="CustomerID">

                </asp:BoundField>
                <asp:BoundField HeaderText=" Company Name" DataField="CompanyName">

                </asp:BoundField>
                <asp:BoundField HeaderText="Contact Name" DataField="ContactName">

                </asp:BoundField>
                <asp:TemplateField HeaderText="Contact Title">
                    <ItemTemplate>
                        <asp:Label ID="lblEmpName" runat="server" Text='<%# Eval("ContactTitle")%>'></asp:Label>
                        <asp:Literal runat="server" ID="lit1" Text="</td><tr id='trCollapseGrid' style='display:none' ><td colspan='5'>" />
                        <asp:GridView ID="gvChild" DataKeyNames="OrderID,EmployeeID"  OnPageIndexChanging="gvChild_PageIndexChanging"  OnRowCommand="gvChild_RowCommand"  AutoGenerateColumns="False"
                            runat="server" EnableViewState="False" ForeColor="#333333" AllowPaging="True">
                            <RowStyle BackColor="#EFF3FB" />
                            <AlternatingRowStyle BackColor="White" />
                            <Columns>
                             <asp:TemplateField>
                                    <ItemTemplate>
                                        <asp:LinkButton ID="Select" CommandArgument='<%# Eval("OrderID") %>' CommandName="select" runat="server">Select</asp:LinkButton>
                                    </ItemTemplate>
                                </asp:TemplateField>
                                <asp:BoundField HeaderText="Order ID" DataField="OrderID" />
                                <asp:BoundField HeaderText="Customer ID" DataField="CustomerID" />
                                <asp:BoundField HeaderText="Employee ID" DataField="EmployeeID" />
                                <asp:BoundField HeaderText="Order Date" DataField="OrderDate" DataFormatString="{0:d}" />
                                <asp:BoundField HeaderText="Require dDate" DataField="RequiredDate" DataFormatString="{0:d}" />

                            </Columns>
                            <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
                        </asp:GridView>
                        <asp:Literal runat="server" ID="lit2" Text="</td></tr>" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
            <RowStyle BackColor="#EFF3FB" />
            <AlternatingRowStyle BackColor="White" />
        </asp:GridView>
    </ContentTemplate>
</asp:UpdatePanel>
<asp:HiddenField ID="hidRowId" runat="server" />
<asp:HiddenField ID="hidImgId" runat="server" />
<asp:GridView ID="OuterGridView" runat="server">
</asp:GridView>
</form>
  

Большое спасибо.

Ответ №1:

Это не будет отличным решением, но, если вы спешите найти решение, вы можете сделать это, чтобы быстро выполнить работу.

Для события привязки к данным строки дочернего grid view добавьте событие onclick, которое перенаправляет пользователя на ту же страницу со специальными строками запроса, скажем, skill amp; empid. При загрузке страницы проверьте, присутствуют ли они. Если да, вызовите метод BindOuterGridView.

 protected void gvChild_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            object objTemp = gvChild.DataKeys[e.Row.RowIndex].Value as object;
            if (objTemp != null)
            {
                string id = objTemp.ToString();
                e.Row.Attributes["onmouseover"] = "this.style.color='DarkGrey';this.style.cursor='hand';";
                e.Row.Attributes["onmouseout"] = "this.style.color='Black';";
                e.Row.Attributes["onclick"] = "window.location.href = 'yourpage.aspx?Id="   id   "'";
            }
        }
    }
  

Комментарии:

1. Спасибо @Reddy за ваше, я пытался, но не смог заставить это работать, поэтому я собираюсь опубликовать свой код ниже, просто чтобы было понятно, я также меняю свой источник данных на northwind DB, поэтому вместо skill amp; empid я использую OrderID и EmployeeID

2. Вы реализовали RowCommand, но не событие RowDataBound для дочернего GV. Реализуйте это и попробуйте в нем использовать что-то похожее на e.Row.Attributes["onclick"] = "window.location.href = 'yourpage.aspx?Id=" id "'"; Очевидно, я не могу протестировать ваш код, поскольку у меня здесь нет настроенной вашей базы данных.

3. Еще лучше, попробуйте выполнить простой пример с событием RawDataBound, прежде чем внедрять его в сложные представления родительской дочерней сетки.