根据上面一篇随笔所介绍的PC购买流程的项目,在项目中,需要有一个生成订单的功能,能够使得Admin很方便的在获得批准的申请中选取一些来生成订单,要求界面操作简单明了,大概的效果图如下:

点击checkbox,自动计算当前订单的总价值,点击按钮,生成订单。

有此想到了用SPGridView这个现成的控件来完成,以前也用过这个控件,其实和GridView没什么大区别。这里就简单介绍一下了:

首先Create 一个WebPart

在CreateChildControls()中可以设置SPGridView 的数据源和属性,添加Field等等。

但是CheckBox这一列,必须自己自定义一个模板类来生成,下面是我们自定义的CheckBox模板类,它实现了ITemplate接口:

代码

class CheckBoxTemplateField:ITemplate
    {
        string id;
        public EventHandler OnCheck = null;
        public CheckBoxTemplateField(string chbId, EventHandler checkEvent)
        {
            id = chbId;
            OnCheck = checkEvent;
        }
        
        public void InstantiateIn(System.Web.UI.Control container)
        {
            CheckBox chb = new CheckBox();
            chb.AutoPostBack = true;
            chb.ID = id;
            chb.CheckedChanged += OnCheck;
            container.Controls.Add(chb);
        }
    }

这样就可以在SPGridView中调用这个模板类,并且为Oncheck事件提供处理方法:

代码

protected override void CreateChildControls()
        {
            if (!_error)
            {
                try
                {
                    SPList sourceList = SPContext.Current.Web.Lists["Purchase Request"];
                    dataSource = new SPDataSource();
                    this.Controls.Add(dataSource);
                    dataSource.List = sourceList;
                    gridView = new SPGridView();
                    gridView.AutoGenerateColumns = false;

TemplateField chbField = new TemplateField();
                    chbField.HeaderText = "";
                    EventHandler onCheck = new EventHandler(OnCheck);
                    chbField.ItemTemplate = new CheckBoxTemplateField("chb", onCheck);
                    gridView.Columns.Add(chbField);

当我们提供了所以的Field绑定后,需要指定一列为Group列,我们这里指定了"Team"列:

代码

SPBoundField createdField = CreateNewBoundField("Created", "Created", 0);
                    gridView.Columns.Add(createdField);

SPBoundField applicantField = CreateNewBoundField("Created By", "Created By", 0);
                    gridView.Columns.Add(applicantField);

SPBoundField mtField = CreateNewBoundField("Machine Type", "Machine Type", 0);
                    gridView.Columns.Add(mtField);

SPBoundField compField = CreateNewBoundField("Component Type", "Component Type", 0);
                    gridView.Columns.Add(compField);

SPBoundField purNumField = CreateNewBoundField("Purchase Number", "Purchase Number", 0);
                    gridView.Columns.Add(purNumField);

SPBoundField purReasonField = CreateNewBoundField("Purchase Reason", "Purchase Reason", 0);
                    gridView.Columns.Add(purReasonField);

SPBoundField mgrAppField = CreateNewBoundField("Manager Approval", "Manager Approval", 0);
                    gridView.Columns.Add(mgrAppField);

SPBoundField drtAppField = CreateNewBoundField("Director Approval", "Director Approval", 0);
                    gridView.Columns.Add(drtAppField);

SPBoundField priceField = CreateNewBoundField("Total Price", "Total Price", 0);
                    gridView.Columns.Add(priceField);

gridView.AllowGrouping = true;
                    gridView.AllowGroupCollapse = true;
                    gridView.GroupField = "Team";
                    gridView.GroupFieldDisplayName = "Team";

但是"Team"这个Field在数据源的List中是Lookup类型的,如果不作处理,那么显示的结果将会是Team:23;#SharePoint Test,即 连lookupid也显示出来了,这里我们需要在数据绑定的时候作处理,为此我们添加了gridView.RowDataBound += new GridViewRowEventHandler(gridView_RowDataBound)这个事件,gridView_RowDataBound的代码如下:

代码

void gridView_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                if ((sender as SPGridView).AllowGrouping)
                {
                    SPGridViewRow gridViewRow = e.Row as SPGridViewRow;
                    if (gridViewRow != null && gridViewRow.HeaderText != null)
                    {
                        gridViewRow.HeaderText = "Team : " + new SPFieldLookupValue(DataBinder.GetPropertyValue(e.Row.DataItem, (sender as SPGridView).GroupField).ToString()).LookupValue;
                    }
                }
            }
        }

这样,确保我们在SPGridView中做Groupby时,显示的只是LookupValue,而非LookupId;#LookUpValue的形式。

另外我们可以通过设置SPGridView的DataKeyNames为各行保存一些我们可能需要的信息,例如

gridView.DataKeyNames = new string[] { "ID", "Team", "Created By", "Total Price", "Machine Type", "Component Type", "Purchase Number", "Shipped Order" };

如下就可以使用这些数据:

gridView.DataKeys[row.RowIndex].Values["Machine Type"].ToString();

我们用SPGridView作为WebPart开发的时候还遇到了一个问题,就是一访问SharePoint的Session,页面就报异常。但是在代码中,并为出现异常,检查了Web.config文件,发现HttpModule中也加了Session Module,<Page>节点中也Enable了Session, 至今未能找出原因,后来不得已,用了Context.Cache来代替,希望各位看官,有知道原因的,还请不吝赐教。谢谢拉~

SPGridView使用不复杂,关键还在于理清楚项目中的业务逻辑,选择合适的Solution来解决问题。

【转】[SharePoint 开发详解] 一个Feature中使用SPGridView的几个Tips相关推荐

  1. 【OpenCV 4开发详解】中值滤波

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  2. 《Android游戏开发详解》——第1章,第1.6节函数(在Java中称为“方法”更好)...

    本节书摘来自异步社区<Android游戏开发详解>一书中的第1章,第1.6节函数(在Java中称为"方法"更好),作者 [美]Jonathan S. Harbour,更 ...

  3. 《Android游戏开发详解》一2.18 使用Java API中的对象

    本节书摘来异步社区<Android游戏开发详解>一书中的第2章,第2.18节,译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社区"异步社区"公众号查看. 2.1 ...

  4. linux exec 脚本之家,详解Shell脚本中调用另一个Shell脚本的三种方式

    主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 ...

  5. javaCV开发详解之8:转封装在rtsp转rtmp流中的应用(无须转码,更低的资源消耗)

    JavaCV免费教程目录: JavaCV入门教程(免费JavaCV教程) javacv实战专栏目录(2016年更新至今): JavaCV实战专栏文章目录(2016年更新至今) 2022年最新JavaC ...

  6. 《linux设备驱动开发详解》笔记——15 linux i2c驱动

    <linux设备驱动开发详解>笔记--15 linux i2c驱动 15.1 总体结构 如下图,i2c驱动分为如下几个重要模块 核心层core,完成i2c总线.设备.驱动模型,对用户提供s ...

  7. Android 蓝牙BLE开发详解

    Android 蓝牙BLE开发详解 由于年初接手了个有关蓝牙BLE的项目,开始了对蓝牙ble的学习,经过长时间的慢慢学习(学得太慢,太拖了),终于了解了该怎么写蓝牙BLE,现在就给大家分享一下. 一. ...

  8. 【OpenCV 4开发详解】分割图像——分水岭法

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  9. 【OpenCV 4开发详解】QR二维码检测

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

最新文章

  1. observable_在Completablefuture和Observable之间转换
  2. Hadoop小知识点
  3. 跨平台屏幕/摄像头RTMP推流模块设计要点
  4. matlab中if可以判断或语句吗,matlab中if 语句后面的判别式不能是算术表达式?或者说变量?...
  5. 视频换脸AISWAP技术示例
  6. druid 连接池监控报错 Sorry, you are not permitted to view this page.
  7. oracle 断电 监听问题,Oracle监听启动后又自动停止的问题及解决
  8. vs多项目模板及add-in开发
  9. html5 后端模板 免费,推荐12个非常不错而且免费的后台管理HTML模板
  10. 使用windows API区分移动硬盘和本地硬盘
  11. php 单词替换,单词替换 - Shiyin's note
  12. .mat转成.npy文件+Python(Pytorch)压缩裁剪图片
  13. 缘,如雁渡寒潭,似风吹疏竹
  14. 2022开放原子全球开源峰会OpenAnolis分论坛圆满落幕
  15. 【Gym 100015B】Ball Painting(DP染色)
  16. writing idiomatic python 读书笔记(2)
  17. MySQL深入浅出之索引
  18. 计算机二战一个双非学校怎样,双非二战学长成功调剂985:看他的调剂院校选择!...
  19. Spring详解—— IOC 和 DI 区别
  20. iOS灵动岛【电商秒杀】开发实践

热门文章

  1. C#带按钮的文本框TextBoxContainButton
  2. Java开启/关闭tomcat服务器
  3. sde用户下使用sqlplus登录错误ORA-12547: TNS:lost contact
  4. codeforces #236 div2 简洁题解
  5. 同步,异步,多线程,你怎么看?
  6. sql SET DATEFORMAT对日期处理的影响
  7. java代码连接redis_java代码连接redis
  8. 计算机网络原理关于实验中几个指令使用的复习——网络层
  9. 3493. 最大的和
  10. python求众数代码_python-LeetCode-求众数