SharePoint 2016 自定义城市和区域字段

  前言

  最近有这么一个需求,就是用到中国的各种行政区,然后还是三级联动,就琢磨写这么一个字段。然后,觉得挺有意义的,写字段的过程也有点心得,就想到拿到博客里分享给大家,一起看看。 

  1、 创建字段的解决方案,包括:字段类、字段控件类、字段控件的前台文件、字段的描述文件、城市和区域的数据列表、字段的Feature和其中所需要的JavaScript库和文件。

  2、 在字段的前台控件上,添加我们需要的控件,当在显示视图(DispForm)的时候,只有一个Label控件用来显示值,除此之外的视图(NewForm和EditForm)的时候,有一个Label控件用来输入下拉框等的html,一个TextBox控件用来保存和修改值,一个隐藏字段用来存一个Guid,防止一个列表加多个字段时,控件的Id有重复。

  3、 初始化控件的核心代码,主要包括输入城市和区域下拉框控件的Html代码,并且绑定相关的事件。

protected override void CreateChildControls()
{
    base.CreateChildControls();
    if (this.Field != null)
    {
        this.lbValue = (Label)TemplateContainer.FindControl("lbValue");
        this.tbValue = (TextBox)TemplateContainer.FindControl("tbValue");
        this.hfValue = (HiddenField)TemplateContainer.FindControl("hfValue");
        this.lbValueResult = (Label)TemplateContainer.FindControl("lbValueResult");
    }
    if (this.ControlMode == SPControlMode.Display)
    {
        if (lbValueResult != null)
        {
            lbValueResult.Text = this.ItemFieldValue.ToString();
        }
    }
    else
    {
        string myGuid = Guid.NewGuid().ToString().Replace("-", "");

        string scriptLink = "<script type='text/javascript' src='/_layouts/15/LinyuCityField/Script.js'></script><script type='text/javascript' src='/_layouts/15/LinyuCityField/jquery-1.7.1.js'></script>";
        string scriptInit = @"<script type='text/javascript'>$(document).ready(function(){
                                    setInterval(syncValue,1000);
                                    initSelect('" + myGuid + @"province','0');
                                    $('#" + myGuid + @"province').change(function(){
                                        var vv = $(this).val();
                                        //if(vv=='11'||vv=='12'||vv=='31'||vv=='50'){$('#" + myGuid + @"district').hide();}else{$('#" + myGuid + @"district').show();}
                                        $('#" + myGuid + @"city').empty();
                                        initSelect('" + myGuid + @"city',vv);
                                        $('#" + myGuid + @"district').empty();
                                    });
                                    $('#" + myGuid + @"city').change(function(){
                                        var vv = $(this).val();
                                        var lsvv=vv.substring(0,2);
                                        //if(lsvv=='11'||lsvv=='31'||lsvv=='12'||lsvv=='50'){$('#" + myGuid + @"district').hide();}else{$('#" + myGuid + @"district').show();}
                                        $('#" + myGuid + @"district').empty();
                                        initSelect('" + myGuid + @"district',vv);
                                    });
                                });</script>";

        string scriptInit2 = @"<script type='text/javascript'>$(document).ready(function(){
                                    setInterval(syncValue,1000);
                                    $('#" + myGuid + @"province').change(function(){
                                        var vv = $(this).val();
                                        //if(vv=='11'||vv=='12'||vv=='31'||vv=='50'){$('#" + myGuid + @"district').hide();}else{$('#" + myGuid + @"district').show();}
                                        $('#" + myGuid + @"city').empty();
                                        initSelect('" + myGuid + @"city',vv);
                                        $('#" + myGuid + @"district').empty();
                                    });
                                    $('#" + myGuid + @"city').change(function(){
                                        var vv = $(this).val();
                                        var lsvv=vv.substring(0,2);
                                        //if(lsvv=='11'||lsvv=='31'||lsvv=='12'||lsvv=='50'){$('#" + myGuid + @"district').hide();}else{$('#" + myGuid + @"district').show();}
                                        $('#" + myGuid + @"district').empty();
                                        initSelect('" + myGuid + @"district',vv);
                                    });
                                });</script>";

        Page.ClientScript.RegisterStartupScript(this.GetType(), "scriptLink", scriptLink);
        string selectHtml = string.Empty;
        if (this.ControlMode == SPControlMode.New)
        {
            Page.ClientScript.RegisterStartupScript(this.GetType(), "scriptInit", scriptInit);
            selectHtml = "<select id='" + myGuid + "province'></select><select id='" + myGuid + "city'></select><select id='" + myGuid + "district'></select>";
        }
        else
        {
            string fieldValue = this.ItemFieldValue.ToString();
            string[] filedValues = fieldValue.Split('-');
            selectHtml = initEditHtml(myGuid, fieldValue);
            Page.ClientScript.RegisterStartupScript(this.GetType(), "scriptInit2", scriptInit2);
        }

        if (hfValue != null)
            hfValue.Value = myGuid;

        if (lbValue != null)
            lbValue.Text = selectHtml;
    }
}

  4、 编辑页面时初始化控件的代码,包括省、城市、区域。

public string initEditHtml(string myGuid, string fieldValue)
{
    string html = string.Empty;
    string[] fvs = fieldValue.Split('-');
    string province = string.Empty;
    string city = string.Empty;
    string district = string.Empty;
    using (SPSite site = new SPSite(SPContext.Current.Site.ID))
    {
        using (SPWeb web = site.OpenWeb(SPContext.Current.Web.ID))
        {
            SPList list = web.Lists.TryGetList("CityDataSourse");
            SPQuery query1 = new SPQuery();
            SPQuery query2 = new SPQuery();
            SPQuery query3 = new SPQuery();
            SPListItem item1;
            SPListItem item2;
            SPListItem item3;
            switch (fvs.Length)
            {
                case 1:
                    query1.Query = "<Where><Eq><FieldRef Name='Title' /><Value Type='Text'>" + fvs[0] + "</Value></Eq></Where>";
                    item1 = list.GetItems(query1)[0];
                    province = getOptions(item1["ParentId"].ToString(), item1["Title"].ToString());
                    break;

                case 2:
                    query1.Query = "<Where><Eq><FieldRef Name='Title' /><Value Type='Text'>" + fvs[0] + "</Value></Eq></Where>";
                    item1 = list.GetItems(query1)[0];
                    province = getOptions(item1["ParentId"].ToString(), item1["Title"].ToString());
                    query2.Query = "<Where><Eq><FieldRef Name='Title' /><Value Type='Text'>" + fvs[1] + "</Value></Eq></Where>";
                    item2 = list.GetItems(query2)[0];
                    city = getOptions(item2["ParentId"].ToString(), item2["Title"].ToString());
                    break;

                case 3:
                    query1.Query = "<Where><Eq><FieldRef Name='Title' /><Value Type='Text'>" + fvs[0] + "</Value></Eq></Where>";
                    item1 = list.GetItems(query1)[0];
                    province = getOptions(item1["ParentId"].ToString(), item1["Title"].ToString());
                    query2.Query = "<Where><Eq><FieldRef Name='Title' /><Value Type='Text'>" + fvs[1] + "</Value></Eq></Where>";
                    item2 = list.GetItems(query2)[0];
                    city = getOptions(item2["ParentId"].ToString(), item2["Title"].ToString());
                    query3.Query = "<Where><Eq><FieldRef Name='Title' /><Value Type='Text'>" + fvs[2] + "</Value></Eq></Where>";
                    item3 = list.GetItems(query3)[0];
                    district = getOptions(item3["ParentId"].ToString(), item3["Title"].ToString());
                    break;
            }
        }
    }
    html = "<select id='" + myGuid + "province'>" + province + "</select><select id='" + myGuid + "city'>" + city + "</select><select id='" + myGuid + "district'>" + district + "</select>";
    return html;
}

  5、 前台JavaScript的原理,根据当前选项的ID获取下一级控件并初始化,Id是下一级控件的Id后缀部分,vv也就是关联的ParentId。

  http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201608/t20160809_1386477.html

function initSelect(Id, vv) {
    try {
        var hfId = $("#DefaultCustomFieldControlZone input[type='hidden']").val();
        if (vv == "11" || vv == "12" || vv == "31" || vv == "50") {
            $("#" + hfId + "district").hide();
        }
        else {
            $("#" + hfId + "district").show();
        }
        var mycontext = new SP.ClientContext.get_current();
        var mysite = mycontext.get_web();
        var query = new SP.CamlQuery();
        query.set_viewXml("<View><Query><Where><Eq><FieldRef Name='ParentId' /><Value Type='Text'>" + vv + "</Value></Eq></Where></Query></View>");
        var mylist = mysite.get_lists().getByTitle('CityDataSourse');
        myitem = mylist.getItems(query);
        mycontext.load(myitem, 'Include(Title,Id,CityId,Code)');
        mycontext.executeQueryAsync(Function.createDelegate(this, function () {
            try {
                $("#" + Id + " option").remove();
                var listsE = myitem.getEnumerator();
                while (listsE.moveNext()) {
                    $("#" + Id).append("<option value='" + listsE.get_current().get_item("CityId") + "'>" + listsE.get_current().get_item("Title") + "</option>");
                }
            }
            catch (ex) { console.log(ex) }
        }), Function.createDelegate(this, function () { alert("failed") }));
    }
    catch (ex) { }
}

  6、 初始化行政区,根据国家统计局的最新县及县以上行政区划代码,用jquery获取DOM元素,并且格式化成我需要的格式,放到列表实例里面使用,这样激活解决方案以后,就有数据源了。

  7、 初始化行政区的JavaScript脚本,水平有限,写的比较烂,大家参考即可。 

 function GetResult()
  {
      var h1 = "<Row><Field Name='Title'>";
      var h2 = "</Field><Field Name='CityId'>";
      var h3 = "</Field><Field Name='ParentId1'>";
      var h4 = "</Field><Field Name='Code'>";
      var h5 = "</Field></Row>";
      var result = "";
      var num = 0;

      $(".TRS_PreAppend p").each(function(){
          var spans = $(this).find("span");
          if($(spans[1]).text()!="县"&&$(spans[1]).text()!="市辖区")
          {
              if($(spans[0]).text().substring(0,2)=="11"||$(spans[0]).text().substring(0,2)=="12"||$(spans[0]).text().substring(0,2)=="31"||$(spans[0]).text().substring(0,2)=="50")
              {
                  if($(spans[0]).text().substring(2,6)=="0000")
                  {
                      result += h1 + $(spans[1]).text() + h2 + $(spans[0]).text().substring(0,2) + h3 + "0" + h4 + $(spans[0]).text() + h5;
                      num++;
                  }
                  else
                  {
                      result += h1 + $(spans[1]).text() + h2 + $(spans[0]).text().substring(0,4) + h3 + $(spans[0]).text().substring(0,2) + h4 + $(spans[0]).text() + h5;
                      num++;
                  }
              }
              else
              {
                  if($(spans[0]).text().substring(2,6)=="0000")
                  {
                      result += h1 + $(spans[1]).text() + h2 + $(spans[0]).text().substring(0,2) + h3 + "0" + h4 + $(spans[0]).text() + h5;
                      num++;
                  }
                  else
                  {
                      if($(spans[0]).text().substring(4,6)=="00")
                      {
                          result += h1 + $(spans[1]).text() + h2 + $(spans[0]).text().substring(0,4) + h3 + $(spans[0]).text().substring(0,2) + h4 + $(spans[0]).text() + h5;
                          num++;
                      }
                      else
                      {
                          result += h1 + $(spans[1]).text() + h2 + $(spans[0]).text().substring(0,6) + h3 + $(spans[0]).text().substring(0,4) + h4 + $(spans[0]).text() + h5;
                          num++;
                      }
                  }
              }
          }
      })
      $("#Result").text(result);
  }

   8、 添加的城市字段,类型为城市和区域,如下图。

  9、 城市字段的效果图,选中省会初始化市,然后初始化区。如果直辖市是初始化区,如下图:

总结

  整个代码的思路就是首先创建一个字段,然后字段的前台控件主要是展示,TextBox里面是值的修改和保存,用JavaScript和前台控件进行交互。为了防止一个列表加多个字段,控件的Id会重复,特意加了Guid作区分。同时,总结行政区的时候也很费劲,突发奇想用JavaScript去整理,然后花了不到两个小时,就整理好了,如果有其他格式的,改改就能用。善哉善哉。

  好吧,如果大家想说没有什么技术含量,确实是体力活居多,有需要的人可以参考参考。好了,就到这里,已经过了12点,睡吧。。

时间: 2024-07-31 01:14:27

SharePoint 2016 自定义城市和区域字段的相关文章

SharePoint使用自定义字段作为分组的栏。当选择视图的默认样式时,不显示数据行;选择视图的其他样式时,可以显示数据行?这是怎么回事

问题描述 SharePoint使用自定义字段作为分组的栏.当选择视图的默认样式时,不显示数据行:选择视图的其他样式时,可以显示数据行?这是怎么回事,怎么解决???测试了几个自定义字段,效果都一样.其中一个可以参考霖雨写的博客:http://www.cnblogs.com/jianyus/p/3462626.html使用环境:SharePoint2013急!!求救,谢谢大家!! 解决方案 解决方案二:你最好截一下图,看不太懂解决方案三:引用1楼linyustar的回复: 你最好截一下图,看不太懂

SharePoint 2016 配置工作流环境

前言 SharePoint 2016 默认创建工作流的时候,工作流平台只包含2010版本,如果想要使用状态机工作流,需要单独安装workflow manager 1.0才可以,下面,我们为大家介绍一下如何为环境安装workflow manager 1.0. SharePoint Designer 2013创建SharePoint 2016可重用工作流截图,只包含SharePoint 2010工作流版本. 工作流环境的安装主要包括两种,一种是使用Microsoft Web Platform Ins

SharePoint 2016 入门视频教程

之前一直有朋友让自己录一些SharePoint的入门视频,之前没有太多时间,一个巧合的机会收到CSDN学院的邮件,可以在CSDN上发布视频教程,自己就录了一些.说起录视频也是蛮辛苦的,每天下班吃完饭要哄一会儿孩子,九点左右打开电脑去厨房开始写ppt,查一些资料,然后自己先做一下实验,觉得没问题了再开始录制.每天完成也要12点以后了,虽然很辛苦还是一直坚持下来,很多朋友跟我说免费,自己也真的想过,不过生活开销也大,所以还是没有免费. 视频主要就是SharePoint的入门,很多东西都是博客里之前介

SharePoint 2013自定义Providers在基于表单的身份验证中的应用

由于项目的需要,登录SharePoint Application的用户将从一个统一平台中获取,而不是从Domain中获取,所以需要对SharePoint Application的身份验证(Claims Authentication Types)进行更改,即采用更加灵活的混合模式登录:Windows Authentication和Forms Based Authentication.故本篇博客将着重笔墨去介绍SharePoint 2013自定义Providers在基于表单的身份验(Forms-Ba

Office 2016自定义安装组件的详细步骤

  不少电脑用户都知道Office 2016是不能随意自定义安装的组件.那么,如果想自定义安装组件的话该怎么办呢?最近,小编就开始研究这个问题,发现自定义安装组件的操作起来还是有点复杂,因此,小编就给大家分享一下Office 2016自定义安装组件的具体步骤 ,相信大家跟着下面的步骤去进行,可以轻松的完成安装组件的操作! Office 2016 Office 2016可选安装组件: Word.Excel.Access.Publisher.OneDrive for business.InfoPat

Office 2016自定义选择组件安装方法

  Office 2016可选安装组件 Word.Excel.Access.Publisher.OneDrive for business.InfoPath.Skype for business.OneNote.Outlook.Powerpoint.Project.Visio. Office 2016自定义安装组件方法 Office 2016 Install 下载 使用方法: 1.解压Office 2016 ISO镜像,然后将解压得到的Office文件夹复制到 Office 2016 Insta

sharePoint 2016 弃用和删除的功能

前言 sharepoint 2016版本正式发布,但是相比较2013版本,还是删除或者准备删除一些功能,我们需要了解一下哪些功能已经被删除掉或者在下一个版本中移除,因为这些可能影响我们现有系统是否能够平稳由其他版本升级到sharepoint server 2016. 以下特性和功能在 SharePoint Server 中已弃用或已删除.   Microsoft SharePoint 的 Duet Enterprise 无法使用 SharePoint Server 2016 部署 Microso

云服务器 ECS 建站教程:阿里云安装SharePoint 2016

阿里云安装SharePoint 2016 系统环境 1.基础配置 Windows Server 2012 4C 8G (请根据真实环境设计架构以及购买服务器配置) 2.软件环境 SQL server 2012 express Sharepoint 2016 AD DNS IIS 3.必备组件 Net Framework 3.5 (安装SQL server 需要.net Framework 3.5 支持) 使用"添加角色和功能"安装可能会安装失败,参考链接:https://help.al

云服务器 ECS 建站教程:ECS搭建Microsoft SharePoint 2016

ECS搭建Microsoft SharePoint 2016 Microsoft SharePoint是Microsoft SharePoint Portal Server的简称.SharePoint Portal Server是一个门户站点,使得企业能够开发出智能的门户站点,这个站点能够无缝连接到用户.团队和知识,因此人们能够更好地利用业务流程中的相关信息,更有效地开展工作.SharePoint Portal Server 提供了一个企业的业务解决方案,它利用了企业应用程序集成功能,以及灵活的