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

简介:   前言   最近有这么一个需求,就是用到中国的各种行政区,然后还是三级联动,就琢磨写这么一个字段。然后,觉得挺有意义的,写字段的过程也有点心得,就想到拿到博客里分享给大家,一起看看。    1、 创建字段的解决方案,包括:字段类、字段控件类、字段控件的前台文件、字段的描述文件、城市和区域的数据列表、字段的Feature和其中所需要的JavaScript库和文件。

  前言

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

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

clip_image001

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

clip_image002

  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元素,并且格式化成我需要的格式,放到列表实例里面使用,这样激活解决方案以后,就有数据源了。

clip_image003

  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、 添加的城市字段,类型为城市和区域,如下图。

clip_image004

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

clip_image005

总结

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

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

目录
相关文章
|
新零售 人工智能
阿里巴巴联合汉仪重磅推出五款人工智能字体:汉仪天真体、英雄体等
众所周知传统做字的人力成本非常之高,如果全靠人类设计师来完成,一套标准字库从设计到完成需要一年多的时间。
13326 0
|
存储 Java 数据库连接
MyBatis-Plus 基础操作指南:实现高效的增删改查
MyBatis-Plus 基础操作指南:实现高效的增删改查
804 0
|
9月前
|
PyTorch API 算法框架/工具
AscendC从入门到精通系列(四)使用Pybind调用AscendC算子
本文介绍了如何通过Pybind11在PyTorch框架中调用自定义的Ascend C算子。首先,通过编写算子的C++实现和pybind11封装,将算子功能暴露给Python。接着,构建Python调用脚本,利用torch接口生成数据并调用封装好的算子模块。最后,通过CMake配置文件编译整个项目,实现从算子开发到测试的完整流程。
|
2月前
|
供应链 监控 API
亚马逊商品详情API响应数据解析
本教程介绍如何使用亚马逊商品详情API(如Product Advertising API或SP-API),通过ASIN或关键词查询商品信息。支持获取价格、库存、评价等50多个字段,适用于价格监控、竞品分析和供应链管理。提供Python请求示例代码,实现商品数据安全高效获取。
|
弹性计算 固态存储 NoSQL
阿里云服务器系统盘和数据盘ESSD Entry、ESSD AutoPL和ESSD云盘区别、性能和价格整理
阿里云服务器系统盘有ESSD Entry、ESSD云盘及ESSD AutoPL三种选择,各自在性能和适用场景上有所不同。ESSD Entry云盘性价比高,适合开发与测试业务;ESSD AutoPL云盘实现容量与性能解耦,支持自定义预配置性能,适用于时延敏感或IO密集型场景;ESSD云盘则提供多种性能级别,适用于大型OLTP数据库和NoSQL数据库等。详情及价格参见阿里云官网。
754 8
|
消息中间件 Java 数据库连接
实时计算 Flink版产品使用合集之将sdkMode从rpc模式改为jdbc模式后,table.exec.mini-batch.enabled参数还生效吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
152 0
|
开发工具 git
Git恢复之前版本的两种方法reset、revert(图文详解)
Git恢复之前版本的两种方法reset、revert(图文详解)
1134 0
|
机器学习/深度学习 编解码 人工智能
高效轻量级语义分割综述
语义分割是自动驾驶中视觉理解的重要组成部分。然而当前SOTA的模型都非常复杂和繁琐,因此不适合部署在计算资源受限且耗时要求较低的车载芯片平台上。本文深入研究了更紧凑、更高效的模型以解决上述问题,这些模型能够部署在低内存嵌入式系统上,同时满足实时推理的需求。本文讨论了该领域一些优秀的工作,根据它们的主要贡献进行归类,最后本文评估了在相同软硬件条件下模型的推理速度,这些条件代表了一个典型的高性能GPU和低内存嵌入式GPU的实际部署场景。本文的实验结果表明,许多工作能够在资源受限的硬件上实现性能和耗时的平衡。
高效轻量级语义分割综述
|
机器学习/深度学习 分布式计算 算法
PySpark ML——分布式机器学习库
继续PySpark学习之路,本篇开启机器学习子模块的介绍,不会更多关注机器学习算法原理,仅对ML库的基本框架和理念加以介绍。最后用一个小例子实战对比下sklearn与pyspark.ml库中随机森林分类器效果。
801 0
PySpark ML——分布式机器学习库
|
敏捷开发 Devops 测试技术
深聊测开领域之:一文搞懂什么是敏捷测试,如何做敏捷测试,建议先收藏再学习。
深聊测开领域之:一文搞懂什么是敏捷测试,如何做敏捷测试,建议先收藏再学习。
943 0
深聊测开领域之:一文搞懂什么是敏捷测试,如何做敏捷测试,建议先收藏再学习。

热门文章

最新文章