当前位置: 首页 > news >正文

杭州北京网站建设公司哪家好海西高端网站建设公司

杭州北京网站建设公司哪家好,海西高端网站建设公司,佛山微信网站建设,开个人网站需要多少钱一个项目涉及XML文档中节点的自动计算#xff0c;就是XML文档的每个节点都参与运算#xff0c;要求#xff1a; ⑴如果节点有计算公式则按照计算公式进行#xff1b; ⑵如果节点没有计算公式则该节点的值就是所有子节点的值之和#xff1b; ⑶节点有4种类型#xff0c;计…  一个项目涉及XML文档中节点的自动计算就是XML文档的每个节点都参与运算要求 ⑴如果节点有计算公式则按照计算公式进行 ⑵如果节点没有计算公式则该节点的值就是所有子节点的值之和 ⑶节点有4种类型计算节点、输入框、单选节点、多选节点 计算节点汇总 输入框点击该节点弹出输入框用于输入数据 单选节点众多选项中只能选择一个根据选择项确定该节点的具体值 多选节点众多选项中可以选择多个该节点的值是所有选择项的和 类似下图实际选项近100个 问题是点击任何图标节点后都要完成的自动计算。 开始的时候我将所有XML信息加载到Treeview中包括属性在Treeview中进行计算完成后同步到XML文档这样完成后效果不好选项多了速度慢如果计算机配置一般的话有略微的卡顿。 今天下午我修改了方法直接在XML文档中进行操作使用递归完成节点的自动计算这样速度很快并且不需要同步到Treeview中因为Treeview只是用于显示。 1、点击节点 在Treeview中确定节点根据节点类型完成图标变化在XML中找到对应的节点。 ⑴完成状态标识如果是Radio则标识单选如果是Checkbox标识多选 ⑵提取Value值如果是Textbox则是输入值如果是Radio则是父项value值是点击节点的Value值如果是Checkbox则父项是所有选择项的value值之和。 ⑶调用自动计算如果是Radio或者Checkbox则是从父项的父项开始如果是Textbox则是从父项开始。 private void treeView1_MouseDown(object sender, MouseEventArgs e){//获取鼠标点击的位置TreeNode FocusNode treeView1.GetNodeAt(e.Location);string StrCurrentFullPath FocusNode.FullPath;string StrNodeType ;if (FocusNode ! null){//获取鼠标点击的位置是否在节点的图标上//在Treeview中针对Radio、Checkbox、TextBook分别进行设置TreeViewHitTestInfo hitTestInfo treeView1.HitTest(e.Location);if (hitTestInfo.Location TreeViewHitTestLocations.Image){StrNodeType FocusNode.Tag.ToString();//鼠标点击了节点的图标switch (StrNodeType){case Radio:// 取消同级节点的选中状态foreach (TreeNode node1 in FocusNode.Parent.Nodes){if (node1 ! FocusNode){node1.ImageKey Radio;node1.SelectedImageKey Radio;}}// 设置当前节点为选中状态FocusNode.ImageKey RadioChecked;FocusNode.SelectedImageKey RadioChecked;//在XML文档中处理HandleNodeInfoAtXmlContent(StrCurrentFullPath, StrNodeType,);//在文档中找到该节点并处理//break;case Checkbox:if (FocusNode.ImageKey Checkbox){FocusNode.ImageKey CheckboxChecked;FocusNode.SelectedImageKey CheckboxChecked;}else{FocusNode.ImageKey Checkbox;FocusNode.SelectedImageKey Checkbox;}//在XML文档中处理HandleNodeInfoAtXmlContent(StrCurrentFullPath, StrNodeType,);//在文档中找到该节点并处理break;case Textbox:string StrMin ;string StrMax ;string StrMemo ;float fTemp;ToTextboxInputWinPara.fMax 0;ToTextboxInputWinPara.fMin 0;ToTextboxInputWinPara.StrMemo ;FrmTextBoxInput FTI new FrmTextBoxInput();DialogResult result FTI.ShowDialog();if(result DialogResult.OK){StrCurrentTextboxValue FTI.StrReturn;}//在XML文档中处理HandleNodeInfoAtXmlContent(StrCurrentFullPath, StrNodeType, StrCurrentTextboxValue);//在文档中找到该节点并处理break;}treeView1.Invalidate();}if (hitTestInfo.Location TreeViewHitTestLocations.Label){//点击标签if (FocusNode.Tag ! null){switch (FocusNode.Tag.ToString()){case Radio:if (FocusNode.ImageKey RadioChecked){FocusNode.SelectedImageKey RadioChecked;}if (FocusNode.ImageKey Radio){FocusNode.SelectedImageKey Radio;}break;case Checkbox:if (FocusNode.ImageKey Checkbox){FocusNode.SelectedImageKey Checkbox;}if (FocusNode.ImageKey CheckboxChecked){FocusNode.SelectedImageKey CheckboxChecked;}break;default: break;}treeView1.Invalidate();}}}}对应在XML文档中的处理函数 private void HandleNodeInfoAtXmlContent(string StrCurrentFullPath,string StrNodeType,string StrInputTextValue){//在XML文档内容中处理节点信息传入参数StrCurrentFullPath是当前点击选择的节点全路径名称int FirstIndex StrCurrentFullPath.IndexOf(\\);int LastIndex StrCurrentFullPath.LastIndexOf(\\);string StrCurrentNodeName StrCurrentFullPath.Substring(LastIndex 1);//提取父节点的名称string[] SubStr StrCurrentFullPath.Split(\\);string ParentStr SubStr[SubStr.Length - 2];// 使用XPath表达式定位到具体的节点点击的节点名称是caption值string XpathExpression;XmlNode CalculateNodenull;//计算节点switch (StrNodeType){case Radio:XpathExpression // ParentStr /option[caption StrCurrentNodeName ];break;case Checkbox:XpathExpression // ParentStr /input[caption StrCurrentNodeName ];break;case Textbox:XpathExpression // ParentStr / StrCurrentNodeName;break;}XmlNode BeSelectNode XmlDoc.SelectSingleNode(XpathExpression);//得到父节点的全路径名string SParentPath StrCurrentFullPath.Substring(0, LastIndex);//得到父节点XmlNode ParentNode FindNodeAtXmlContentByFullPath(SParentPath);XmlNode TempNode null;if (BeSelectNode ! null ParentNode!null){//根据节点类型处理本节点switch (StrNodeType){case Radio:string StrValue ;//找到该节点标识选中状态foreach (XmlNode RadioChildNode in ParentNode.ChildNodes){//单选先将父节点下的子节点的select属性全部删除if (RadioChildNode.Attributes[select] ! null){RadioChildNode.Attributes.Remove(RadioChildNode.Attributes[select]);}//找到子节点if (RadioChildNode.Attributes[caption].Value StrCurrentNodeName){TempNode RadioChildNode;StrValue TempNode.Attributes[value].Value;}}//添加select属性if (TempNode!null){ if (HasAttribute(TempNode, select)){TempNode.Attributes[select].Value true;}else{XmlAttribute RadioNodeAttr XmlDoc.CreateAttribute(select);RadioNodeAttr.Value true;TempNode.Attributes.Append(RadioNodeAttr);}}//为父节点的value属性赋值ParentNode.Attributes[value].Value StrValue;//寻找父节点的父节点CalculateNode ParentNode.ParentNode;//计算Autocalculate(CalculateNode);break;case Checkbox:Single TempSum 0.0f;//找到该节点标识状态如果是选择则去掉没有选择则加上同时计算和foreach (XmlNode CheckChildNode in ParentNode.ChildNodes){if (CheckChildNode.Attributes[caption].Value StrCurrentNodeName){TempNode CheckChildNode;}}//添加select属性if (HasAttribute(TempNode, select)){if (TempNode.Attributes[select].Value true){//如果已经选择了需要去掉选择TempNode.Attributes.Remove(TempNode.Attributes[select]);}else{TempNode.Attributes[select].Value true;}}else{XmlAttribute CheckSelectedAttr XmlDoc.CreateAttribute(select);CheckSelectedAttr.Value true;TempNode.Attributes.Append(CheckSelectedAttr);}foreach (XmlNode CheckChildNode in ParentNode.ChildNodes){if (HasAttribute(CheckChildNode, select)){TempSum Convert.ToSingle(CheckChildNode.Attributes[value].Value);}}//为父节点的value属性赋值ParentNode.Attributes[value].Value TempSum.ToString();//寻找父节点的父节点CalculateNode ParentNode.ParentNode;//计算Autocalculate(CalculateNode);break;case Textbox://找到该节点修改Value值BeSelectNode.Attributes[value].Value StrInputTextValue;//寻找本节点的父节点CalculateNode BeSelectNode.ParentNode;//计算Autocalculate(CalculateNode);break;}}else{textBox1.Text 提取属性值发生错误没有找到对应节点或者属性值错误 Environment.NewLine;}} 2、递归计算 private void Autocalculate(XmlNode CalculateNode){//在XML文档中节点自动计算结果//CalculateResult MyCalcuteResult new CalculateResult();float fSum 0f;string StrID ;string StrValue ;string StrFormula ;Boolean Continue true;string StrFalse ;//判断是否有子节点if (CalculateNode.HasChildNodes){//有子节点需要看是否有计算公式根据指定的节点进行自动计算if (HasAttribute(CalculateNode, formula)){//如果节点有formula属性则提取出计算公式。StrFormula GetAttrValue(CalculateNode, formula);//将所有子节点的值进行替换完成后再进行计算。foreach (XmlNode MyNode in CalculateNode.ChildNodes){if (HasAttribute(MyNode,id)){StrID MyNode.Attributes[id].Value;StrValue MyNode.Attributes[value].Value;if (StrValue.IsNullOrEmpty()){Continue false;StrFalse ${StrID}为空;break;}else{//替换公式中的字符串,ID和值StrFormula StrFormula.Replace(StrID, StrValue);}}else{Continue false;}}if (Continue){//进行计算获得结果fSum GetFormulaResult(StrFormula);}}else{//没有formula属性计算结果等于所有子节点的和。foreach (XmlNode MyNode in CalculateNode.ChildNodes){StrValue MyNode.Attributes[value].Value;if (StrValue.IsNullOrEmpty()){Continue false;StrFalse MyNode.Name 的值为空;break;}else{fSum Convert.ToSingle(StrValue);}}}if (Continue){//修改本节点的Value属性CalculateNode.Attributes[value].Value fSum.ToString();}CalculateNode CalculateNode.ParentNode;//if (CalculateNode.NodeType XmlNodeType.Document)if(CalculateNodenull){StrFalse 没有了父节点;Continue false;}//是否继续计算if (Continue){Autocalculate(CalculateNode);}else{textBox1.Text StrFalseEnvironment.NewLine;}}}这个问题看似简单实际上也的确不难就是有一点麻烦需要耐心去解决细节问题。
http://www.hkea.cn/news/14382828/

相关文章:

  • h5手机制作网站开发叶文语 厦门建设局
  • 软件培训网站建设上海中学排名
  • 网站建设保报价文档公司网站名词解释
  • 内蒙古建设厅网站建设工程教育网论坛官网
  • 自己做的影视网站买会员违法吗运营型网站
  • 网站改版升级17网一起做网店普宁
  • 酒店网站建设范文su域名注册
  • 网页制作教程第二版北京seo网站开发
  • 网站制作广免费网站建站下载
  • 中国建筑网官网登录太原seo代理
  • 广州设计网站培训班asp网站浏览器兼容
  • 海南做网站的公司中国兰州网首页
  • 北京外贸网站建设公司一流的镇江网站优化
  • 个体工商户经营范围做网站微信小程序怎么制作网页
  • 关于网站开发相关法律条款上海网站建设费用多少钱
  • 北京网站建设案例定制开发软件产品的税率
  • 网站后台管理系统域名专门做灯具海报的网站
  • 塑胶原料东莞网站建设技术支持网站推广流程
  • 广西建设厅官网站首页做网站 对方传销
  • 三明市建设局网站官网中小企业名录
  • 十大黄金软件app免费系统优化
  • 网站建设与管理规划书网站翻页
  • 学校网站建设意义做网站公司法人还要拍照吗
  • 做鞋设备网站淘宝客必须做网站
  • centos wordpress 建站教程兰州网站维护公司
  • 灵犀科技网站开发佼佼者网站开发前端要学什么软件
  • 长春求推荐好的网站优化推广sdk软件开发工具包
  • 电子商务网站开发费用调研报告网站建设公司客户来源渠道
  • 自己设计的网站如何推广网站换域名做301会有影响
  • 国企门户网站建设方案网站建设轮播图