设为首页 收藏本站
查看: 977|回复: 0

[经验分享] [SharePoint 开发详解] 一个Feature中使用SPGridView的几个Tips

[复制链接]

尚未签到

发表于 2015-9-24 11:09:07 | 显示全部楼层 |阅读模式
  根据上面一篇随笔所介绍的PC购买流程的项目,在项目中,需要有一个生成订单的功能,能够使得Admin很方便的在获得批准的申请中选取一些来生成订单,要求界面操作简单明了,大概的效果图如下:
DSC0000.jpg
  点击checkbox,自动计算当前订单的总价值,点击按钮,生成订单。
  有此想到了用SPGridView这个现成的控件来完成,以前也用过这个控件,其实和GridView没什么大区别。这里就简单介绍一下了:
  首先Create 一个WebPart
  在CreateChildControls()中可以设置SPGridView 的数据源和属性,添加Field等等。
  但是CheckBox这一列,必须自己自定义一个模板类来生成,下面是我们自定义的CheckBox模板类,它实现了ITemplate接口:
  

DSC0001.gif DSC0002.gif 代码

    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来解决问题。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-118136-1-1.html 上篇帖子: SharePoint 2010开发实例精选——可排序的搜索核心结果 下篇帖子: SharePoint客户端开发:增加用户信息到用户信息列表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表