簡體   English   中英

根據GridView1中的選定行填充GridView2

[英]Populates GridView2 based on selected row from GridView1

我的頁面上有2個gridview:在GridView1上,我有一列包含選擇鏈接,Id和Name,如下所示:

Select | Id | Name
select | 101 | Jack
select | 102 | Cath

現在,我想做的是,我單擊第一行中的Jack進行選擇,現在我的GridView2將顯示Jack訂購的產品,如下所示:

Id | ProductID
101 | 111
101 | 222
101 | 333

如果我選擇的是Cath,則GridView2將更改按Cath訂購的顯示產品:

Id | productID
102 | 111
102 | 333
102 | 555

簡而言之,我正在嘗試根據GridView1中的選定行填充GridView2。 我在C#中使用asp.net。

在第一個網格中選擇行時,在網格的selectIndexChanged事件中,獲取主鍵ID的值並存儲在hiddenField中。如果您使用過Datakey,則使用

 SelectedDatakey

取得SelectedDatakey的值並存儲在hiddenfield中

protected void CustomersGridView_SelectedIndexChanged(Object sender, EventArgs e)
  {

   hiddenfield1.value = CustomersGridView.SelectedDataKey.Value;

  }

現在,在填充第二個網格的查詢中,傳遞存儲在hiddenfield中的第一個網格的鍵值,並根據查詢結果填充第二個網格

這是我的示例代碼……

  protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        List<Data> DataList = new List<Data>() { new Data { id = 1, id2 = 2 }, new Data { id = 3, id2 = 4 } };
        GridView1.DataSource = DataList;
        GridView1.DataBind();
    }
}
protected void Button1_Click(object sender, EventArgs e)
{
    Button btn = (Button)sender;
    GridViewRow row = (GridViewRow ) btn.NamingContainer;

    Label slNoLabel = (Label) row.FindControl("slNoLabel");
    // function to get data based on label vlue
    GridView2.DataSource=GetData(slNoLabel.Text);
    GridView2.DataBind();

}

DataTable GetData(string value)
{
DataTable tbl = new DataTable ();
    //   Calling DB 
    return tbl;
    }
}

public class Data
{
    public int id { get; set; }
    public int id2 { get; set; }
}

並在用戶界面中

 <div>
    <asp:GridView ID="GridView1" runat="server">
        <Columns>
            <asp:TemplateField ShowHeader="False">
                <ItemTemplate>
                    <asp:Button ID="Button1" runat="server" CausesValidation="False" CommandName="Select" OnClick="Button1_Click" Text="Select" />
                    <asp:Button ID="Button2" runat="server" CausesValidation="False" CommandName="Delete" Text="Delete" />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
    <asp:GridView ID="GridView2" runat="server"></asp:GridView>
</div>

您可以在為“選擇”添加的鏈接按鈕上添加onClick方法。

   <asp:GridView ID="Gridview1" runat="server"
                    AllowPaging="true" PageSize="15" RowStyle-Wrap="true" EmptyDataRowStyle-ForeColor="Red"
                    AutoGenerateColumns="false" GridLines="None">
                    <Columns>
                        <asp:TemplateField HeaderText="Select">
                            <ItemTemplate>
                            <asp:LinkButton ID ="li_Select" runat="server" Text="Select" OnClick="li_Select_Click"></asp:LinkButton>                                   
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="ID">
                            <ItemTemplate>
                                <asp:Label runat="server" ID="lbl_ID" Text='<%#Eval("ID") %>' />
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="Name">
                            <ItemTemplate>
                                <asp:Label runat="server" ID="lbl_Name" Text='<%#Eval("Name") %>' />
                            </ItemTemplate>
                        </asp:TemplateField>
                    </Columns>

                </asp:GridView>                  

現在,根據單擊的行ID過濾數據或從數據庫中獲取數據。

  protected void li_Select_Click(object sender, EventArgs e)
{

    LinkButton lnkbtn = (LinkButton)sender;
    GridViewRow row = (GridViewRow)lnkbtn.NamingContainer;
    Label lbl_ID = (Label)row.FindControl("lbl_ID");

  // You can fetch the data from the database on the basis of selected User ID .
    DataTable dt = new DataTable();
    dt.Columns.Add("ID");
    dt.Columns.Add("Product_ID");
    for (int i = 100; i <= 110; i++)
    {
        DataRow dr = dt.NewRow();
        dr["ID"] = i;
        dr["Product_ID"] = "P_" + i;
        dt.Rows.Add(dr);
    }
    // In this method you pass the id of the user, and datatable fetched from the    database of all products. or you can pass the id in the storedprocedure to get data of selected user only and then bind it here .
    GetData(lbl_ID.Text,dt);
}
protected void GetData(string ID, DataTable dt)
{       

    DataView dv = dt.DefaultView;
    dv.RowFilter = "ID=" + ID;
    Gridview2.DataSource = dv;
    Gridview2.DataBind();

}

我認為這樣做的最好方法是使用UpdatePanel綁定第二個網格,使用此方法您將具有一個優勢,即沒有回發(實際上是回發,但用戶不會注意到它..)...

而且,如果您不使用UpdatePanel ,那么在回發中將數據綁定之后,您將無法查看數據(除非您通過Javascript進行處理,這很麻煩)...以下是實現該目標的示例代碼它:

ASPX頁面:

<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:GridView ID="GridView2" runat="server" >
            <Columns>

            </Columns>
        </asp:GridView>
    </ContentTemplate>
</asp:UpdatePanel>

<asp:UpdatePanel runat="server">
    <ContentTemplate>
    <asp:GridView ID="GridView1" runat="server">
        <Columns>
            <asp:TemplateField HeaderText="Name">
                <ItemTemplate>
                    <asp:LinkButton ID="asd" Text='Select' runat="server" OnClick="link_click"></asp:LinkButton>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
    </ContentTemplate>
</asp:UpdatePanel>

背后的代碼:

protected override void PageLoad(object sender, System.EventArgs e)
{

    if (!IsPostBack)
    {

        GridView1.DataSource = getDataSource();
        GridView1.DataBind();

    }
}
private DataTable getDataSource()
{

    SqlConnection conn = new SqlConnection("Server=192.168.1.1;DATABASE=dummy;UID=****;PWD=*****;");    //Example connString
    SqlCommand comm = new SqlCommand("SELECT * FROM Table1", conn);
    SqlDataAdapter ad = new SqlDataAdapter(comm);

    DataTable ta = new DataTable();
    ad.Fill(ta);

    return ta;
}

protected void button_click(object sender, EventArgs e)
{
    LinkButton asd = (LinkButton)sender;
    GridViewRow row = (GridViewRow)asd.NamingContainer;     //Gets the selected Row

    string user_id = row.Cells[2].Text;     //Use this to get any value you want.
    //Can now use the user_name to get the data for the grid 2, and update the panel
    GridView2.DataSource = getDataSource2(user_id);
    GridView2.DataBind();
    UpdatePanel1.Update();
}
private DataTable getDataSource2(string user_id)
{
    string sql = "SELECT * FROM TABLE2 WHERE user_id = @user_id";
    SqlConnection conn = new SqlConnection("Server=sqlserver\\sql2008;DATABASE=esm80;UID=sa;PWD=sa;");    //Example connString
    SqlCommand comm = new SqlCommand();
    comm.CommandText = sql;
    comm.Parameters.AddWithValue("@name", user_id);
    comm.Connection = conn;

    SqlDataAdapter ad = new SqlDataAdapter(comm);

    DataTable ta = new DataTable();
    ad.Fill(ta);

    return ta;
}

現在的交代,在UpdatePanel GridView2的是,一旦有數據被綁定到它(這將顯示新綁定數據)來更新gridView2。 GridView1的UpdatePanel可以防止來自鏈接按鈕的回發。

希望這能回答您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM