绑定嵌套网格视图并从嵌套网格内的控件中查找值





0/5 (0投票)
简介:在本文中,我将发布“如何绑定嵌套 GridView 并使用嵌套 GridView 中的嵌套控件”。绑定嵌套 Grid 和
简介:在本文中,我将发布“如何绑定嵌套 GridView 并使用嵌套 GridView 中的嵌套控件”。
绑定嵌套 Grid 并使用嵌套 GridView 中的任何控件与普通的 GridView 有所不同。在本文中,我将展示如何根据从数据库检索到的任何值执行更新操作和在下拉列表中选择项目。
很多时候我们需要嵌套 GridView。并且很多时候我们在 GridView 中使用下拉列表,我们在下拉列表中有一些项目,然后我们希望根据从数据库检索到的值来选择一个项目。并且我们希望更新嵌套 GridView 的任何列。那么让我们开始吧。
我这里使用的是三层架构,我有一个两个独立的类:1. 逻辑层 (logiclayer) 和 2. 数据层 (datalayer)。
我在父 GridView 的 Row_DataBound 事件中绑定了嵌套 GridView。我使用 commandArgument 来识别嵌套 GridView 的行。并且还根据数据库值在 dropdownlist 中选择项目。
我从数据库检索数据,并在嵌套 GridView 的 dropdownlist 中选择项目,然后在 dropdownlist 中选择项目。
用户还可以通过从下拉列表中选择项目来更新状态。在 dropdownlist 中我有 3 个项目(Open/Close/Finish)。
如果数据库中是 Open,那么在绑定时 Open 将会在 dropdownlist 中被选中,如果 Finish/Close 那么将会选择 Finis/Close。
用户更新状态,为了更新状态,他/她从下拉列表中选择状态,然后单击嵌套 GridView 中的更新 LinkButton。在更新 LinkButton 上,我根据任务 ID 更新状态。那时我从嵌套 GridView 中的 Label 控件找到任务 ID。我使用 LinkButton 的 commandArgument 属性来识别行。
这是我的代码隐藏文件:
using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
public partial class _Default : System.Web.UI.Page
{
logiclayer li = new logiclayer(); // logiclayer 是我在三层架构中的业务层,这是我项目中的一个独立类
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
fillparent();
}
}
public void fillparent() // 绑定父 GridView
{
GridView1.DataSource = li.selectparent();
GridView1.DataBind();
// 我们也可以通过在父 GridView 的 databound 事件中编写代码来选择 dropdownlist 中的状态。
for (int i = 0; i < GridView1.Rows.Count; i++) // 在嵌套 GridView 的下拉列表中选择状态
{
GridView childgrid = (GridView)GridView1.Rows[i].FindControl("GridView2");
for (int m = 0; m < childgrid.Rows.Count; m++)
{
li.pid = Convert.ToInt32(((Label)childgrid.Rows[m].FindControl("Label4")).Text);
li.getstatus(li);
DropDownList childroplst = (DropDownList)childgrid.Rows[m].FindControl("DropDownList1");
for (int k = 0; k < childroplst.Items.Count; k++)
{
if (childroplst.Items[k].ToString() == li.status)
{
childroplst.Items[k].Selected = true;
}
}
}
}
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)// 绑定嵌套 GridView 与父 GridView
{
li.pid =Convert.ToInt32(( (Label)e.Row.FindControl("Label3")).Text);
GridView childgrd = (GridView)e.Row.FindControl("GridView2"); // 从父 GridView 中查找嵌套 GridView
childgrd.DataSource = li.fillchild(li);
childgrd.DataBind();
}
}
protected void GridView2_RowCommand(object sender, GridViewCommandEventArgs e)
{
GridView GridView2 = (GridView)sender; // 查找嵌套 GridView
GridViewRow chrow = (GridViewRow)GridView2.Parent.Parent; // 父 Grid 的行,用于从父 Grid 中查找任何控件
if (e.CommandName == "update")
{
int index = Convert.ToInt32(e.CommandArgument); // 使用 command argument 来识别嵌套 GridView 中的行
li.pid = Convert.ToInt32(((Label)GridView2.Rows[index].FindControl("Label4")).Text); // 来自嵌套 GridView 的 Label4 中的 id
DropDownList childrop = ((DropDownList)GridView2.Rows[index].FindControl("DropDownList1")); // 获取嵌套 GridView 的下拉列表框
li.status = childrop.SelectedItem.Text;
li.updatechild(li); // 根据任务 ID 在数据库中更新状态
// 如果我们想重新绑定,则可以使用注释掉的代码...
//li.pid = Convert.ToInt32(((Label)chrow.FindControl("Label3")).Text);
//GridView2.DataSource = li.fillchild(li);
//GridView2.DataBind();
li.pid = Convert.ToInt32(((Label)GridView2.Rows[index].FindControl("Label4")).Text);
li.getstatus(li);// 从数据库检索状态。li 是 logic layer 的对象
for (int i = 0; i < childrop.Items.Count; i++) // 根据数据库中的状态在下拉列表中选择状态。
{
if (childrop.Items[i].ToString() == li.status)
{
childrop.Items[i].Selected = true;
}
}
}
}
}
**********************************************
这是我的设计页面 .aspx
<%@ 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">
<div>
<center>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
onrowdatabound="GridView1_RowDataBound">
<Columns>
<asp:TemplateField HeaderText="Project">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("p_name") %>'></asp:Label>
<asp:Label ID="Label3" runat="server" Text='<%# Bind("id") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Sub Task">
<ItemTemplate>
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False" onrowcommand="GridView2_RowCommand"
>
<Columns>
<asp:TemplateField HeaderText="Task Name">
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Bind("t_name") %>'></asp:Label>
<asp:Label ID="Label4" runat="server" Text='<%# Bind("t_id") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Task Status">
<ItemTemplate>
<asp:DropDownList ID="DropDownList1" runat="server">
<asp:ListItem>Open</asp:ListItem>
<asp:ListItem>Close</asp:ListItem>
<asp:ListItem>Finish</asp:ListItem>
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" CommandName="update" CommandArgument="<%#((GridViewRow) Container).RowIndex %>">Update</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<HeaderStyle BackColor="#CCCCFF" />
</asp:GridView>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<HeaderStyle BackColor="Maroon" ForeColor="#FFCC00" />
</asp:GridView>
</center>
</div>
</form>
</body>
</html>