GRIDVIEW
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Master-Detail GridView Part 2
前面的Master-Detail GridView 控件应用,相信你已在市面上的书、或网络上见过,但此节中的GridView 控件应用包你没看过,但一定想过!见下图。
你一定很想惊呼?这是GridView 吗??不是第三方控件的效果吧?是的!这是GridView 控件,而且只需要不到100 行程序代码!!请先建立一个UserControl:DetailsGrid.ascx,加入一个SqlDataSource 控件连结至Northwind 的Order Details 数据表,选取所有字段,接着在WHERE 区设定如下图的条件。
接着加入一个GridView 控件系结至此SqlDataSource 控件,并将Enable Editing 打勾,然后于原始码中键入下面的程序代码。
开发问题:不知道Enable Editing在哪?(已经知道,在配置SqlDataSource 控件时需要对其高级选项进行设置一下!)
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class DetailsGrid : erControl
{
public int OrderID
{
get
{
object o = ViewState["OrderID"];
return o == null ? -1 : (int)o;
}
set
{
ViewState["OrderID"] = value;
SqlDataSource1.SelectParameters[0].DefaultValue =
value.ToString();
}
}
protected void Page_Load(object sender, EventArgs e)
{
}
}
接着建立一个新网页,加入SqlDataSource 控件系结至Northwind 的Orders 数据表,然后加入一个GridView 控件,并于其字段编辑器中加入一个TemplateField,于其内加入一个LinkButton 控件,设定其属性如下图。
然后设定LinkButton 的DataBindings 如下图。
开发中的问题:
Linkbutton找不到数据源。
然后于原始码中键入下面的程序代码。
using System;
using System.Collections.Generic;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls;
public partial class CollapseGridView : System.Web.UI.Page
{
private List _collaspedRows = new List();
private List _delayAddRows = new List();
注:总是提示以上两行代码错误!
private bool RowIsCollasped(GridViewRow row)
{
if(_collaspedRows.Count > 0)
return
_collaspedRows.Contains((int)GridView1.DataKeys[row.RowIndex].Value);
return false;
}
private void CreateDetailRow(GridViewRow gridRow)
{
if (RowIsCollasped(gridRow))
{
GridViewRow row = new GridViewRow(gridRow.RowIndex, -1,
DataControlRowType.DataRow, DataControlRowState.Normal);
TableCell cell = new TableCell();
row.Cells.Add(cell);
TableCell cell2 = new TableCell();
cell2.Attributes["colspan"] = (GridView1.Columns.Count - 1).ToString();
Control c = LoadControl("DetailsGrid.ascx");
((DetailsGrid)c).OrderID =
(int)GridView1.DataKeys[gridRow.RowIndex].Value;
cell2.Controls.Add(c);
row.Cells.Add(cell2);
_delayAddRows.Add(row);
}
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected override void LoadViewState(object savedState)
{
Pair state = (Pair)savedState;
base.LoadViewState(state.First);
_collaspedRows = (List)state.Second;
}
protected override object SaveViewState()
{
Pair state = new Pair(base.SaveViewState(), _collaspedRows); return state;
}
}
接下来在TemplateField 中的LinkButton 的Click 事件中键入下面的程序代码。
protected void LinkButton1_Click(object sender, EventArgs e)
{
LinkButton btn = (LinkButton)sender;
int key = int.Parse(mandArgument);
if (_collaspedRows.Contains(key))
{
_collaspedRows.Remove(key);
GridView1.DataBind();
}
else
{
_collaspedRows.Clear(); // clear.
_collaspedRows.Add(key);
GridView1.DataBind();
}
}
最后在GridView 控件的RowCreated、PageIndexChanging 事件中键入下面的程序代码。
protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
if(e.Row.RowType == DataControlRowType.DataRow)
CreateDetailRow(e.Row);
else if (e.Row.RowType == DataControlRowType.Pager &&
_delayAddRows.Count > 0)
{
for (int i = 0; i < GridView1.Rows.Count; i++)
{
if (RowIsCollasped(GridView1.Rows[i]))
{
GridView1.Controls[0].Controls.AddAt(GridView1.Rows[i].RowIndex + 2,
_delayAddRows[0]);
_delayAddRows.RemoveAt(0);
}
}
}
}
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
_collaspedRows.Clear();
}
执行后就能看到前图的效果了,那具体是如何做到的呢?我们知道,我们可以在GridView 控件中动态的插入一个GridViewRow 控件,而GridViewRow 控件可以拥有多个Cell,每个Cell 可以拥有子控件,那么当这个子控件是一个UserControl 呢?相信说到这份上,读者已经知道整个程序的运行基础及概念了,剩下的细节如LoadViewState、SaveViewState 等函式只是状态的管理,看懂这个范例后!你应该也想到了其它的应用了(UserControl 中放DetailsView、FormView、MultiView、TabControl 或是再嵌上另一个UserControl,成为巢状式应用,想都会笑了吧!),对于GridView!相信你已经毫无疑问了!本文所附的范例程序中将此技巧与AJAX 结合,发挥到极致,下面列出此范例的截图,你会发现我们其实错估了GridView 控件的强大威力。
如何? 2.0 其实给了我们一个很专业、强大的GridView 控件不是吗?此范例可由此下载:http://www.dreams.idv.tw/~code6421/files/GridView1.zip。