Master-Detail GridView

article/2025/9/10 8:38:10
梦幻版Master-Detail GridView(黄忠成)
2007-12-26 09:34

前面的Master-Detail GridView控件應用,相信你已在市面上的書、或網路上見過,但此節中的GridView控件應用包你沒看過,但一定想過!請見圖4-8-63。
圖4-8-63
4-8-64
你一定很想驚呼?這是 GridView 嗎??不是第三方控件的效果吧?是的!這是 GridView 控件,而且只需要不到 100 行程式碼!!請先建立一個 UserControl DetailsGrid.ascx ,加入一個 SqlDataSource 控件連結至 Northwind Order Details 資料表,選取所有欄位,接著在 WHERE 區設定如圖 4-8-65 的條件。
4-8-65
接著加入一個 GridView 控件繫結至此 SqlDataSource 控件,並將 Enable Editing 打勾,然後於原始碼中鍵入 4-8-17 的程式碼。
程式 4-8-17
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 : System.Web.UI.UserControl
{
    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 控件,設定其屬性如圖 4-8-66
4-8-66
然後設定 LinkButton DataBindings 如圖 4-8-67
4-8-67
然後於原始碼中鍵入 4-8-18 的程式碼。
程式 4-8-18
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<int> _collaspedRows = new List<int>();
    private List<GridViewRow> _delayAddRows = new List<GridViewRow>();
    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<int>)state.Second;
    }
    protected override object SaveViewState()
    {
        Pair state = new Pair(base.SaveViewState(), _collaspedRows);
        return state;
    }
}
接下來在 TemplateField 中的 LinkButton Click 事件中鍵入 4-8-19 的程式碼。
程式 4-8-19
protected void LinkButton1_Click(object sender, EventArgs e)
{
        LinkButton btn = (LinkButton)sender;       
        int key = int.Parse(btn.CommandArgument);
        if (_collaspedRows.Contains(key))
        {
            _collaspedRows.Remove(key);
            GridView1.DataBind();
        }
        else
        {
            _collaspedRows.Clear(); // clear.
            _collaspedRows.Add(key);
            GridView1.DataBind();
        }
}
最後在 GridView 控件的 RowCreated PageIndexChanging 事件中鍵入 4-8-20 的程式碼。
程式 4-8-20
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 ,哈 !) ,對於 GridView !你已經毫無疑問了!


http://chatgpt.dhexx.cn/article/2TkGZn0B.shtml

相关文章

GridView DataGrid

ASP.NET 2.0提供了功能强大的数据绑定控件GridView、在使用中&#xff0c;一些属性和方法经常会与ASP.NET 1.1中的DataGrid混淆(VS2005中依然可以使用DataGrid&#xff0c;手动添加到工具箱或HTML状态输入代码)&#xff0c;下面我们分别用GridView和DataGrid实现其数据绑定、编…

GridView详讲

GridView是ASP.NET界面开发中的一个重要的控件&#xff0c;对GridView使用的熟练程度直接影响软件开发的进度及功能的实现。(车延禄) GridView的主要新特性&#xff1a; 1.与DataSource控件结合实现了显示与数据操作的分离&#xff0c;大大减化了代码的编写量; 2.实现"双向…

GridView详述

GridView无代码分页排序GridView选中&#xff0c;编辑&#xff0c;取消&#xff0c;删除GridView正反双向排序GridView和下拉菜单DropDownList结合GridView和CheckBox结合鼠标移到GridView某一行时改变该行的背景色方法一鼠标移到GridView某一行时改变该行的背景色方法二GridVi…

GridView、ListView、Adapter、Map、HashMap

1.ListView自定义适配器adapter 注&#xff1a;Android适配器是数据和视图之间的桥梁&#xff0c;以便于数据在View上显示。适配器就像显示器&#xff0c;把复杂的东西按人可以接受的方式来展现。 &#xff08;1&#xff09;首先将适配器的View视图表现出来&#xff0c;使用L…

GridViewPager

GridViewPager ViewPager结合GridView&#xff0c;轻松实现类似表情面板的控件。可自由定制Item布局&#xff0c;提供充足的自定义参数等。也处理了条目点击事件和条目长按事件。效果如下&#xff1a; Demo下载地址&#xff1a;GridViewPager &#xff0c;或者扫描以下二维码…

libevent 编译

1.下载源码 github:https://github.com/libevent/libevent 官网&#xff1a;http://libevent.org/ 2.CMake 编译 在libevent源码目录建立文件夹&#xff1a;BuildVs2010_x64 2.打开CMake 3.BuildVs2010_x64 下此时生成了vs2010的解决方案。然后编译生成就ok NOTE&#x…

13、《Libevent中文帮助文档》学习笔记13:Linux下集成、运行libevent

Linux下编译libevent的指导可以参考《4、《Libevent中文帮助文档》学习笔记4&#xff1a;Linux下编译libevent》&#xff0c;完成编译、安装&#xff0c;生成so库后&#xff0c;其他程序即可依赖libevent的so库&#xff0c;使用libevent的功能。 由于没有通过prefix指定安装路…

libevent 编译与安装 (WIN10 visual studio2019, ubuntu,centos)

文章目录 一、准备安装包二、编译与安装编译zlib编译openssl编译libevent 三、libevent集成zlib测试程序修改编译&#xff08;可选&#xff09;四、测试程序五、linux(ubuntu)测试安装依赖环境&#xff0c;依次编译zlib,openssl,libeventwindows与linux共享文件夹&#xff08;使…

Libevent 学习一:Libevent 源码编译

文章目录 Libevent 学习一&#xff1a;Libevent 源码编译Libevent Windows 编译Windows 编译环境安装 Visual Studio Community 2015安装 zlib安装 OpenSSL安装 Libeventcmake 安装 LibeventLibevent 测试程序 Libevent Linux编译CentOS 7 安装 LibeventLibevent 测试程序 Libe…

libevent mysql_libevent安装总结

1.先用&#xff1a;ls -al /usr/lib | grep libevent 查看是否已安装&#xff1b;如果已安装且版本低于1.3&#xff0c;则先通过&#xff1a;rpm -e libevent —nodeps进行卸载。 2.下载libevent安装包&#xff1a;libevent-2.0.18-stable.tar.gz。 wget https://github.com/do…

在window用vcpkg安装libevent

参考readme https://github.com/microsoft/vcpkg/blob/master/README_zh_CN.md 使用的PackageManager方式安装&#xff0c; Package Managers 下载 vcpkg 依赖管理包 git clone https://github.com/Microsoft/vcpkg.git cd vcpkg ./bootstrap-vcpkg.bat ./vcpkg integrate…

libevent实践01:准备源码、搭建项目、编译脚本和入门例子

编译源码 libevent是一个Reactor事件库。 我的理解&#xff0c;就是封装了select、epoll、poll的函数库。有使用select&#xff0c;poll&#xff0c;epoll的需求就可以使用的。 官网地址&#xff1a;https://libevent.org/ 下载源码&#xff1a; https://github.com/libev…

libevent(1)windows下安装libevent

Socket通信库libevent成熟、稳定、性能高&#xff0c;在unix和windows下都能使用&#xff0c;在证券交易领域也有不少成功的应用&#xff0c;已经用事实证明是非常棒的socket通信库。对我们目前交易系统的unix重构来说&#xff0c;是比较合适的选择 –– 坑少、在证券交易项目中…

Libevent库的学习

目录 Libevent 概述 Libevent 使用模型 使用Libevent的基本流程&#xff1a; libevent 的核心&#xff0c;event 事件 1. 创建一个事件event 2. 释放event_free 3. 注册event 4. 信号事件 5. 销毁event_base Libevent 结构图 使用libevent库去实现tcp服务器 Libev…

编译libevent

本文记录在win10编译libevent的过程 1.编译前准备zlib,openssl zlib网址 http://www.zlib.net/ 下载源码解压缩 打开vs的dos窗口 32位选择32位窗口这里选择64位,cd 到解压后的文件夹 执行 nmake /f win32/Makefile.msc 执行后可以看到目录下有lib文件和dll文件和测试文件…

libevent简要介绍

libevent库 开源。精简。跨平台&#xff08;Windows、Linux、Maxos、unix&#xff09;。专注于网络通信。 源码包安装&#xff1a; ./configure 检查安装环境 生成makefile make 生成.o和可执行文件 sudo make install …

Libevent库的简介

一、libevent是什么 Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库&#xff0c;主要有以下几个亮点&#xff1a;事件驱动&#xff08; event-driven&#xff09;&#xff0c;高性能;轻量级&#xff0c;专注于网络&#xff0c;不如 ACE 那么臃肿庞大&#xff1b…

libevent库学习(1)

一、初识 1、libevent介绍 Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库&#xff0c;主要有以下几个亮点&#xff1a;事件驱动&#xff08; event-driven&#xff09;&#xff0c;高性能;轻量级&#xff0c;专注于网络&#xff0c;不如 ACE 那么臃肿庞大&…

详解Libevent网络库

项目中要用到libevent&#xff0c;所以就自学了libevent&#xff0c;参考资料为张亮的《libevent源码深度剖析》和《linux高性能服务器编程》 Libevent简介 Libevent是开源社区一款高性能的I/O框架库&#xff0c;其具有如下特点&#xff1a; 1.跨平台支持。Libevent支持Linu…

Libevent库的介绍与应用

Libevent库 Libevent概述Libevent使用模型Libevent库使用示例Libevent事件类型和框架结构使用Libevent完成tcp服务端 Libevent概述 Libevent是开源社区的一款高性能的I/O框架库&#xff0c;使用Libevent的著名案例有&#xff1a;高性能的分布式内存对象缓存软件memcached,Goog…