• 玩转控件:Fucking ERP之流程图


    前言

        首先,跟守护在作者公众号和私信作者催更的朋友们道个歉。疫情的原因,公司从年初到现在一直处于996+的高压模式,导致公众号更新频率较低。而且作者每更新一篇原创公众号,既要对自己沉淀知识负责,也要对愿意和作者一起探讨一起学习一起进步的小伙伴儿们负责,防止误人子弟。所以作者的每一篇原创,都是作者在有限时间内仔细推敲后的产物,希望大家可以理解。

    Talk is Cheap! 

        前面分享的几个章节,差不多把实际用到的控件和容器的封装、扩展、重绘都举例到了(后续如果还有其他特例,作者也会更新进来)。今天要分享的依然是“Fucking ERP”系列中比较重要的环节——流程图。

        本章的流程图并非工作流,winform在市面上有很多经典的工作流组件比如微软的WWF,还有很多开源自主研发的工作流组件等等,后续作者实际用到的话也会分享出来和大家一起探讨。此处分享的流程图,主要是"标识"的作用,主要用来表示业务数据的流转,具体数据如何流转,都需要各位后台自行处理(说白了,就是从A表查出数据,插入到B表,然后更新A表标识罢了。)

    Show me the Code!

        首先,界面加载的时候,初始化控件可用性,以及所有模块列表

    private void frmWorkFlow_Load(object sender, EventArgs e)
    {
        //创建大模块
        CreateModule();
        this.TabPage1.PageVisible = false;
        this.TabPage2.PageVisible = false;
        this.TabPage3.PageVisible = false;
    
        this.kzxsBtnAddButton.Enabled = false;
        this.kzxsBtnAddLabel.Enabled = false;
        this.kzxsBtnAddLine.Enabled = false;
    
        this.Btn_SaveButton.Enabled = false;
        this.Btn_SaveLabel.Enabled = false;
        this.Btn_SaveLine.Enabled = false;

       为了满足演示效果,本位都用DataTable来模拟数据库操作。初始化模块菜单方法如下:

     //创建主目录
    public void CreateModule()
    {
        //此处拿DataTable来存储数据库的所有菜单节点,此处用销售模块来举例
        DataTable dtSalesOrder = new DataTable();
        dtSalesOrder.Columns.Add("sID", typeof(Guid));
        dtSalesOrder.Columns.Add("sModel", typeof(string));
        dtSalesOrder.Columns.Add("iOrder", typeof(int));
        dtSalesOrder.Rows.Add(new object[] { Guid.NewGuid(), "销售模块", 1 });
    
        DataRow[] dr = dtSalesOrder.Select("", "iOrder");
    
        //存在子菜单生产树结构
        if (dr.Length > 0)
        {
            foreach (DataRow row in dr)
            {
                DevExpress.XtraEditors.SimpleButton sb = new DevExpress.XtraEditors.SimpleButton();
                sb.Name = row["sID"].ToString();
                sb.Text = row["sModel"].ToString();
                sb.Tag = row["sModel"].ToString();
                sb.TabIndex = int.Parse(row["iOrder"].ToString());
                sb.Dock = DockStyle.Top;
                sb.Height = 25;
                sb.Click += onBtnClick;
                panelControl1.Controls.Add(sb);
    
            }
        }
    }

        模块按钮绑定了点击事件,用于触发当前选择的菜单的流程图(代码逻辑已经添加,时间有限,本文不做处理,如有疑问,可公众号私信作者一起探讨)

    private void onBtnClick(object sender, EventArgs e)
      {
          sModel = ((DevExpress.XtraEditors.SimpleButton)sender).Name.ToString().Trim();
          sModelName = ((DevExpress.XtraEditors.SimpleButton)sender).Text.ToString().Trim();
          //根据选择的菜单模块,加载当前菜单的流程图
          CreateFlowMap(((DevExpress.XtraEditors.SimpleButton)sender).Name.ToString().Trim(), ((DevExpress.XtraEditors.SimpleButton)sender).Text.ToString().Trim());
      }

        创建流程图部分方法如下(有需要源码可关注作者公众号,私信作者免费获取):

    //创建流程图
    public void CreateFlowMap(string sModelID, string sModelName)
    {
        //查找是否存在流程图   
        string sFilter = "sModelCode =  '" + sModelID + "'";
        TabControl2.Visible = true;
        Boolean bExists = false;
        //查找模块流程图是否存在
        foreach (DevExpress.XtraTab.XtraTabPage tabPage in TabControl2.TabPages)
        {
            if (tabPage.Name == sModelID)
            {
                tabPage.PageVisible = true;
                TabControl2.SelectedTabPage = tabPage;
                bExists = true;
            }
            else
            {
                tabPage.PageVisible = false;
            }
        }
        //不存在需要增加页面
        if (!bExists)
        {
        .....

        You say a JB without pictures !无图言X,先给大家看看设计图

       图片展示解析:

        1.左侧栏初始化动作,加载所有系统模块

        2.右侧上部分为操作栏,设计按钮处理当前选中的菜单模块,用于加载/新增/删除当前模块的流程图

        3.右侧左边部分为绘制工具栏,此处只拿绘制直线(或带箭头的直线),Label(流程注释),按钮来举例子。

        4.右侧下部分为绘制工具栏的属性配置,点击保存,呈现绘制结果如图右侧中间部分

        5.流程图展示区,用于加载或绘制流程图

       (以上因篇幅和时间限制未做详细测试,主要实现功能为主举个例子,作者绘制期间也有遇到不完善的地方,后续有时间在优化)

         代码没有太大难度(需要源码研究可关注作者公众号,私信作者免费获取),主要跟大家分享下绘制流程模块吧。

    (带箭头的)直线的绘制  

        Talk is Cheap,直接上代码:

      KzxLine line = new KzxLine();
    
      bAddLine = true;
      line.Name = "Line";
      line.Tag = "";
      line.lineWidth = int.Parse(this.cmb_LineWidth.Text.ToString());
      string sColor = this.cmb_ColorLine.Text.ToString().Trim();
      switch (sColor)
      {
          case "Black":
              line.LineColor = KzxLine.ColorType.Black;
              break;
          case "Blue":
              line.LineColor = KzxLine.ColorType.Blue;
              break;
          case "Green":
              line.LineColor = KzxLine.ColorType.Green;
              break;
          case "Lime":
              line.LineColor = KzxLine.ColorType.Lime;
              break;
          case "Red":
              line.LineColor = KzxLine.ColorType.Red;
              break;
          case "Yellow":
              line.LineColor = KzxLine.ColorType.Yellow;
              break;
          default:
              line.LineColor = KzxLine.ColorType.Black;
              break;
      }
      line.IsSolid = !this.chk_Solid.Checked;
      switch (this.cmb_ArrowType.Text.ToString().Trim())
      {
          case "Start":
              line.ArrowPosition = KzxLine.ArrowType.Start;
              break;
          case "End":
              line.ArrowPosition = KzxLine.ArrowType.End;
              break;
          case "All":
              line.ArrowPosition = KzxLine.ArrowType.All;
              break;
          case "None":
              line.ArrowPosition = KzxLine.ArrowType.None;
              break;
      }
      if (this.chk_Horizon.Checked)
      {
          line.LineStyle = KzxLine.LineType.Horizontal;
          line.Left = int.Parse(this.edt_LeftLine.Text.ToString());
          line.Top = int.Parse(this.edt_TopLine.Text.ToString());
          line.Width = int.Parse(this.edt_WidthLine.Text.ToString());
          line.Height = int.Parse(this.cmb_LineWidth.Text.ToString()) * 2 + 10;
      }
      else
      {
          line.LineStyle = KzxLine.LineType.Vertical;
          line.Left = int.Parse(this.edt_LeftLine.Text.ToString());
          line.Top = int.Parse(this.edt_TopLine.Text.ToString());
          line.Width = int.Parse(this.cmb_LineWidth.Text.ToString()) * 2 + 10;
          line.Height = int.Parse(this.edt_HeightLine.Text.ToString());
      }
      line.Visible = true;
    
      line.Click += onClick;
      MoveClass.BarcodeControl(line);
      if (bFirstControl)
      {
          MoveClass.BarcodeCreate();
          bFirstControl = false;
      }
      this.TabControl2.Enabled = true;
      this.TabControl1.SelectedTabPage = TabPage3;
      this.TabPage3.PageVisible = true;
    
      this.kzxsBtnAddButton.Enabled = true;
      this.kzxsBtnAddLabel.Enabled = true;
      this.kzxsBtnAddLine.Enabled = true;

        其中KzxLine是作者封装的用户控件,(如有需要,请关注公众号私信作者,源码免费赠送)部分代码如下:

        

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        //e.Graphics.DrawLine(new Pen(lineColor, lineHeight), 1, 1, this.Width, lineHeight);
    
        AdjustableArrowCap lineCap = new AdjustableArrowCap(5, 5, true);
        Pen p = new Pen(lineColor, 1);
    
        string sColor = "";
        if ((int)color == 0) 
        {
            sColor = "Black";
        }
        if ((int)color == 1)
        {
            sColor = "Red";
        }
        if ((int)color == 2)
        {
            sColor = "Yellow";
        }
        if ((int)color == 3)
        {
            sColor = "Blue";
        }
        if ((int)color == 4)
        {
            sColor = "Green";
        }
        if ((int)color == 5)
        {
            sColor = "Lime";
        }
       
        p.Color = Color.FromName(sColor);
        p.Width = LWidth;
    
        if ((int)ArrowP == 1)
        {
            p.CustomStartCap = lineCap;
        }
        else
            if ((int)ArrowP == 2)
            {
                p.CustomEndCap = lineCap;
            }
            else
                if ((int)ArrowP == 3)
                {
                    p.CustomStartCap = lineCap;
                    p.CustomEndCap = lineCap;
                }
    
        if (!Solid)
        {
            float[] dashValues = { 5, 2, 5, 2 };
            p.DashPattern = dashValues;
        }
    
        int iLeft = 1;
        int iTop = 1;
        int iWidth = 1;
        int iHeight = 1;
    
        if ((int)sTyle == 0)
        {
            iLeft = 1;
            iTop = LWidth * 2 + 5;
            iWidth = this.Width;
            iHeight = LWidth * 2 + 5;
        }
        else
        {
            iLeft = LWidth * 2 + 5;
            iTop = 1;
            iWidth = LWidth * 2 + 5;
            iHeight = this.Height;
        }
        e.Graphics.DrawLine(p, iLeft, iTop, iWidth, iHeight);
        p.Dispose();
    }

        点击如图"箭头/直线"按钮后,下面会显示控件的属性配置区域,设置好后点击保存,就会把绘制好的控件添加到流程图展示区。保存事件如下:

    private void Btn_SaveLine_Click(object sender, EventArgs e)
    {
        if (bAddLine)
        {
            KzxLine line = new KzxLine();
    
            line.Name = "Line";
            line.Tag = "";
            line.lineWidth = int.Parse(this.cmb_LineWidth.Text.ToString());
            string sColor = this.cmb_ColorLine.Text.ToString().Trim();
            switch (sColor)
            {
                case "Black":
                    line.LineColor = KzxLine.ColorType.Black;
                    break;
                case "Blue":
                    line.LineColor = KzxLine.ColorType.Blue;
                    break;
                case "Green":
                    line.LineColor = KzxLine.ColorType.Green;
                    break;
                case "Lime":
                    line.LineColor = KzxLine.ColorType.Lime;
                    break;
                case "Red":
                    line.LineColor = KzxLine.ColorType.Red;
                    break;
                case "Yellow":
                    line.LineColor = KzxLine.ColorType.Yellow;
                    break;
                default:
                    line.LineColor = KzxLine.ColorType.Black;
                    break;
            }
            line.IsSolid = !this.chk_Solid.Checked;
            switch (this.cmb_ArrowType.Text.ToString().Trim())
            {
                case "Start":
                    line.ArrowPosition = KzxLine.ArrowType.Start;
                    break;
                case "End":
                    line.ArrowPosition = KzxLine.ArrowType.End;
                    break;
                case "All":
                    line.ArrowPosition = KzxLine.ArrowType.All;
                    break;
                case "None":
                    line.ArrowPosition = KzxLine.ArrowType.None;
                    break;
            }
            if (this.chk_Horizon.Checked)
            {
                line.LineStyle = KzxLine.LineType.Horizontal;
                line.Left = int.Parse(this.edt_LeftLine.Text.ToString());
                line.Top = int.Parse(this.edt_TopLine.Text.ToString());
                line.Width = int.Parse(this.edt_WidthLine.Text.ToString());
                line.Height = int.Parse(this.cmb_LineWidth.Text.ToString()) * 2 + 10;
            }
            else
            {
                line.LineStyle = KzxLine.LineType.Vertical;
                line.Left = int.Parse(this.edt_LeftLine.Text.ToString());
                line.Top = int.Parse(this.edt_TopLine.Text.ToString());
                line.Width = int.Parse(this.cmb_LineWidth.Text.ToString()) * 2 + 10;
                line.Height = int.Parse(this.edt_HeightLine.Text.ToString());
            }
            line.Visible = true;
    
            line.Click += onClick;
            MoveClass.BarcodeControl(line);
            if (bFirstControl)
            {
                MoveClass.BarcodeCreate();
                bFirstControl = false;
            }
            this.TabControl2.Enabled = true;
            bAddLine = false;
    
            TabControl2.SelectedTabPage.Controls.Add(line);
            this.kzxsBtnAddButton.Enabled = true;
            this.kzxsBtnAddLabel.Enabled = true;
            this.kzxsBtnAddLine.Enabled = true;
            this.sBtnDelete.Enabled = true;
        }
        else if ((selectControl is KzxLine) && (KzxLine)selectControl != null)
        {
            ((KzxLine)selectControl).lineWidth = int.Parse(this.cmb_LineWidth.Text.ToString());
            string sColor = this.cmb_ColorLine.Text.ToString().Trim();
            switch (sColor)
            {
                case "Black":
                    ((KzxLine)selectControl).LineColor = KzxLine.ColorType.Black;
                    break;
                case "Blue":
                    ((KzxLine)selectControl).LineColor = KzxLine.ColorType.Blue;
                    break;
                case "Green":
                    ((KzxLine)selectControl).LineColor = KzxLine.ColorType.Green;
                    break;
                case "Lime":
                    ((KzxLine)selectControl).LineColor = KzxLine.ColorType.Lime;
                    break;
                case "Red":
                    ((KzxLine)selectControl).LineColor = KzxLine.ColorType.Red;
                    break;
                case "Yellow":
                    ((KzxLine)selectControl).LineColor = KzxLine.ColorType.Yellow;
                    break;
                default:
                    ((KzxLine)selectControl).LineColor = KzxLine.ColorType.Black;
                    break;
            }
            ((KzxLine)selectControl).IsSolid = !this.chk_Solid.Checked;
            switch (this.cmb_ArrowType.Text.ToString().Trim())
            {
                case "Start":
                    ((KzxLine)selectControl).ArrowPosition = KzxLine.ArrowType.Start;
                    break;
                case "End":
                    ((KzxLine)selectControl).ArrowPosition = KzxLine.ArrowType.End;
                    break;
                case "All":
                    ((KzxLine)selectControl).ArrowPosition = KzxLine.ArrowType.All;
                    break;
                case "None":
                    ((KzxLine)selectControl).ArrowPosition = KzxLine.ArrowType.None;
                    break;
            }
            if (this.chk_Horizon.Checked)
            {
                ((KzxLine)selectControl).LineStyle = KzxLine.LineType.Horizontal;
                ((KzxLine)selectControl).Left = int.Parse(this.edt_LeftLine.Text.ToString());
                ((KzxLine)selectControl).Top = int.Parse(this.edt_TopLine.Text.ToString());
                ((KzxLine)selectControl).Width = int.Parse(this.edt_WidthLine.Text.ToString());
                ((KzxLine)selectControl).Height = int.Parse(this.cmb_LineWidth.Text.ToString()) * 2 + 10;
            }
            else
            {
                ((KzxLine)selectControl).LineStyle = KzxLine.LineType.Vertical;
                ((KzxLine)selectControl).Left = int.Parse(this.edt_LeftLine.Text.ToString());
                ((KzxLine)selectControl).Top = int.Parse(this.edt_TopLine.Text.ToString());
                ((KzxLine)selectControl).Width = int.Parse(this.cmb_LineWidth.Text.ToString()) * 2 + 10;
                ((KzxLine)selectControl).Height = int.Parse(this.edt_HeightLine.Text.ToString());
            }
        }
    }

       因所有绘制控件都绑定了拖拽事件,所以可以在流程图展示区随意拖拽部署显示控件(效果见下图)。 

    Label(注释)控件封装

      /// <summary>
        /// 标签验证
        /// </summary>
        public partial class KzxLabel : KzxBaseControl

        Label无需重绘只需封装,初始化绑定多语言即可。

      public void LayoutControl()
      {
          BindingEvent(this, PluginInfoTable);
          if (this.DesignMode == true)
          {
              this.DesigeCaption = GetLanguage(this.MessageCode, this.DesigeCaption);
          }
      }
    
      /// <summary>
      /// 绑定事件
      /// </summary>
      /// <param name="eventInfoTable">事件信息表</param>
      public override void BindingEvent(DataTable eventInfoTable)
      {
          BindingEvent(this, eventInfoTable);
      }
    
      private void KzxLabel_Load(object sender, EventArgs e)
      {
          LayoutControl();
          //UpdateDelegate d = LayoutControl;
          //this.BeginInvoke(d);
      }

    按钮控件封装

        按钮的封装同上Label一样,具体请移步《玩转控件:扩展Dev中SimpleButton》.或者直接用Dev原生的SimpleButton亦可,此处不做过多废话。只需在属性配置区域的保存事件中,添加到流程图展示区即可,配置区的按钮保存代码如下:

     BillInfo info = new BillInfo();
    //info.sID = Edt_FrmBtn.EditValue.ToString();
    info.sFrmName = Edt_FrmBtn.Text.ToString();
    info.sFrmCaption = Edt_CaptionBtn.Text.Trim();
    info.sMsgID = Edt_MsgBtn.Text.ToString().Trim();
    
    if (bAddBtn)
    {
        DevExpress.XtraEditors.SimpleButton sb = new DevExpress.XtraEditors.SimpleButton();
        sb.Left = int.Parse(Edt_LeftBtn.Text.Trim());
        sb.Top = int.Parse(Edt_TopBtn.Text.Trim());
        sb.Width = int.Parse(Edt_WidthBtn.Text.Trim());
        sb.Height = int.Parse(Edt_HightBtn.Text.Trim());
        sb.Name = Edt_FrmBtn.Text.Trim();
        sb.Text = Edt_CaptionBtn.Text.Trim();
    
        sb.Tag = info;
    
        sb.Image = picture1.Image;
        sb.ImageLocation = DevExpress.XtraEditors.ImageLocation.TopCenter;
        sb.Cursor = Cursors.Hand;
        sb.Visible = true;
        TabControl2.SelectedTabPage.Controls.Add(sb);
    
        sb.Click += onClick;
        MoveClass.BarcodeControl(sb);
        if (bFirstControl)
        {
            MoveClass.BarcodeCreate();
            bFirstControl = false;
        }
        this.TabControl2.Enabled = true;
        bAddBtn = false;
    
        this.kzxsBtnAddButton.Enabled = true;
        this.kzxsBtnAddLabel.Enabled = true;
        this.kzxsBtnAddLine.Enabled = true;
    }
    else if ((selectControl is DevExpress.XtraEditors.SimpleButton) && (DevExpress.XtraEditors.SimpleButton)selectControl != null)
    {
        ((DevExpress.XtraEditors.SimpleButton)selectControl).Left = int.Parse(Edt_LeftBtn.Text.Trim());
        ((DevExpress.XtraEditors.SimpleButton)selectControl).Top = int.Parse(Edt_TopBtn.Text.Trim());
        ((DevExpress.XtraEditors.SimpleButton)selectControl).Width = int.Parse(Edt_WidthBtn.Text.Trim());
        ((DevExpress.XtraEditors.SimpleButton)selectControl).Height = int.Parse(Edt_HightBtn.Text.Trim());
        ((DevExpress.XtraEditors.SimpleButton)selectControl).Name = Edt_FrmBtn.Text.Trim();
        ((DevExpress.XtraEditors.SimpleButton)selectControl).Text = Edt_CaptionBtn.Text.Trim();
    
        ((DevExpress.XtraEditors.SimpleButton)selectControl).Tag = info;
        ((DevExpress.XtraEditors.SimpleButton)selectControl).Image = picture1.Image;
        ((DevExpress.XtraEditors.SimpleButton)selectControl).ImageLocation = DevExpress.XtraEditors.ImageLocation.TopCenter;
        ((DevExpress.XtraEditors.SimpleButton)selectControl).Cursor = Cursors.Hand;
    }

        以上便是"箭头/直线","Label注释","按钮"等功能的准备工作,具体效果如图:

        再次强调,因时间和篇幅问题,作者没有对代码做严格的校验,主要以实现功能为主。所以当您拿到源码时需要根据实际情况自行完善,或者后续作者有时间也会继续完善(工作996+的我太难了!)   

        各个模块功能实现后,就是保存当前绘制的流程图环节了,为了演示效果,作者没有处理数据库相关的工作,主要以DataTable来存储相关绘制数据的。至于图片,作者是用流的方式来存储的,展示时解析即可。

    #region 图片处理
      /// <summary>
      /// 点击上传图片
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
      private void picture1_Click(object sender, EventArgs e)
      {
          if (this.openDialog1.ShowDialog() == DialogResult.OK)
          {
              picture1.Image = Image.FromFile(this.openDialog1.FileName);
          }
      }
      /// <summary>
      /// 用流的方式来存储图片
      /// </summary>
      /// <param name="img"></param>
      /// <returns></returns>
      private byte[] convertByte(Image img)
      {
          MemoryStream ms = new MemoryStream();
          img.Save(ms, img.RawFormat);
          byte[] bytes = ms.ToArray();
          ms.Close();
          return bytes;
      }
      private Image convertImg(byte[] datas)
      {
          MemoryStream ms = new MemoryStream(datas);
          Image img = Image.FromStream(ms, true);
          ms.Close();
          return img;
      }
    
      #endregion

        DataTable数据存储如下图:

      大家可以根据自己实际情况,存储到数据库或者配置文件中,具体保存代码如下:

     int iOrder = 0; 
    foreach (Control c in TabControl2.SelectedTabPage.Controls)
    {
        //string sID = "";
        string sFrmName = "";
        string sCaption = "";
        string sType = "";
        string sBtnPositon = "";
        string sArrowType = "";
        string sFrmType = "";
        string sMsgID = "";
        string sColor = "";
        Boolean bSolid = true;
        Boolean bUnderLine = false;
        Boolean bHorzion = true;
    
        int iLeft = 0;
        int iTop = 0;
        int iWidth = 0;
        int iHeight = 0;
        int iLineWidth = 0;
        float iFontSize = 0;
        BillInfo info = c.Tag as BillInfo;
    
        if (c is DevExpress.XtraEditors.SimpleButton)
        {
            //Button按钮
            //sID = info.sID;
            sFrmName = c.Name.ToString().Trim();
            sCaption = c.Text.ToString().Trim();
            sFrmType = info.sFrmType;
            sMsgID = info.sMsgID;
            sType = "Btn";
            iLeft = c.Left;
            iTop = c.Top;
            iWidth = c.Width;
            iHeight = c.Height;
            sBtnPositon = "TopCenter";
        }
        else if (c is DevExpress.XtraEditors.LabelControl)
        {
            //Label控件
            //sID = info.sID;
            sFrmName = c.Name.ToString().Trim();
            sCaption = c.Text.ToString().Trim();
            sFrmType = info.sFrmType;
            sMsgID = info.sMsgID;
            sType = "Label";
            iLeft = c.Left;
            iTop = c.Top;
            iWidth = c.Width;
            iHeight = c.Height;
    
            if (c.Font.Underline)  //下划线
            {
                bUnderLine = true;
            }
            iFontSize = ((DevExpress.XtraEditors.LabelControl)c).Font.Size; //字体大小
            sColor = ((DevExpress.XtraEditors.LabelControl)c).ForeColor.Name.ToString(); //字体颜色
    
        }
        else if (c is KzxLine)
        {
            sCaption = "Line";
            sType = "Line";
            if (((KzxLine)c).ArrowPosition == KzxLine.ArrowType.Start)
            {
                sArrowType = "Start";
            }
            else if (((KzxLine)c).ArrowPosition == KzxLine.ArrowType.End)
            {
                sArrowType = "End";
            }
            else if (((KzxLine)c).ArrowPosition == KzxLine.ArrowType.All)
            {
                sArrowType = "All";
            }
            else if (((KzxLine)c).ArrowPosition == KzxLine.ArrowType.None)
            {
                sArrowType = "None";
            }
            //颜色
            if (((KzxLine)c).LineColor == KzxLine.ColorType.Black)
            {
                sColor = "Black";
            }
            else if (((KzxLine)c).LineColor == KzxLine.ColorType.Blue)
            {
                sColor = "Blue";
            }
            else if (((KzxLine)c).LineColor == KzxLine.ColorType.Green)
            {
                sColor = "Green";
            }
            else if (((KzxLine)c).LineColor == KzxLine.ColorType.Lime)
            {
                sColor = "Lime";
            }
            else if (((KzxLine)c).LineColor == KzxLine.ColorType.Red)
            {
                sColor = "Red";
            }
            else if (((KzxLine)c).LineColor == KzxLine.ColorType.Yellow)
            {
                sColor = "Yellow";
            }
            else if (((KzxLine)c).LineColor == KzxLine.ColorType.Black)
            {
                sColor = "Black";
            }
            iLineWidth = ((KzxLine)c).lineWidth;
    
            if (!((KzxLine)c).IsSolid)
            {
                bSolid = false;
            }
    
            if (((KzxLine)c).LineStyle == KzxLine.LineType.Horizontal)
            {
                bHorzion = true;
                iLeft = ((KzxLine)c).Left;
                iTop = ((KzxLine)c).Top + ((KzxLine)c).lineWidth * 2 + 5;
                iWidth = ((KzxLine)c).Width + ((KzxLine)c).Left;
                iHeight = ((KzxLine)c).Top + ((KzxLine)c).lineWidth * 2 + 5;
            }
            else
            {
                bHorzion = false;
                iLeft = ((KzxLine)c).Left + ((KzxLine)c).lineWidth * 2 + 5;
                iTop = ((KzxLine)c).Top;
                iWidth = ((KzxLine)c).Left + ((KzxLine)c).lineWidth * 2 + 5;
                iHeight = ((KzxLine)c).Top + ((KzxLine)c).Height;
            }
    
            //gc[i] = c;
        }
    
        if ((c is DevExpress.XtraEditors.SimpleButton) || (c is DevExpress.XtraEditors.LabelControl)
            || (c is KzxLine))
        {
            DataRow newRow = dtDesign.NewRow();
            newRow["uGuid"] = Guid.NewGuid().ToString("D");
            newRow["sModelCode"] = sModel;
            //newRow["sID"] = sID;
            newRow["sFrmName"] = sFrmName;
            newRow["sCaption"] = sCaption;
            newRow["sType"] = sType;
            newRow["iLeft"] = iLeft;
            newRow["iTop"] = iTop;
            newRow["iWidth"] = iWidth;
            newRow["iHeight"] = iHeight;
            newRow["sBtnPositon"] = sBtnPositon;
            newRow["sArrowType"] = sArrowType;
            if (c is DevExpress.XtraEditors.SimpleButton)
            {
                if (((DevExpress.XtraEditors.SimpleButton)c).Image != null)
                    newRow["mImage"] = convertByte(((DevExpress.XtraEditors.SimpleButton)c).Image);
            }
            else
            {
                newRow["mImage"] = null;
            }
            //newRow["mImage"] = sModel;
            newRow["iOrder"] = iOrder;
            newRow["bActive"] = 1;
            newRow["sFrmType"] = sFrmType;
            newRow["sMsgID"] = sMsgID;
            newRow["sColor"] = sColor;
            newRow["iLineWidth"] = iLineWidth;
            newRow["iFontSize"] = iFontSize;
            newRow["sSysMode"] = "";
            newRow["bSolid"] = bSolid;
            newRow["bUnderLine"] = bUnderLine;
            newRow["bHorizon"] = bHorzion;
            dtDesign.Rows.Add(newRow);
    
            iOrder = iOrder + 1;
        }
    }
    
    //TODO:保存到数据库操作
    
    this.Btn_SaveButton.Enabled = false;
    this.Btn_SaveLabel.Enabled = false;
    this.Btn_SaveLine.Enabled = false;
    
    bDesign = false;
    bAddBtn = false;
    bAddLabel = false;
    bAddLine = false;
    
    this.Btn_Design.Enabled = true;
    this.Btn_Post.Enabled = false;
    this.kzxsBtnAddButton.Enabled = false;
    this.kzxsBtnAddLabel.Enabled = false;
    this.kzxsBtnAddLine.Enabled = false;
    this.Btn_Cancel.Enabled = false;
    
    this.TabControl2.Enabled = true;
    
    //TODO:从数据库加载数据流并绑定数据  
    
    
    this.TabControl2.TabPages.Remove(this.TabControl2.SelectedTabPage);
    CreateFlowMap(sModel, sModelName);

       如上代码TODO出需要根据自己实际完善,或者公众号私信作者一起探讨。

       至此工作完成!一起来看看最终效果:

        由于后续所有重写/重绘控件都在同一个项目使用,而且Dev系统引用文件较多,压缩后源码文件仍然很大,如果有需要源码的朋友,可以微信公众号联系博主,源码可以免费赠予~!有疑问的也可以CALL我一起探讨。

        最后,感谢您的耐心陪伴!如果觉得本篇博文对您或者身边朋友有帮助的,麻烦点个关注!赠人玫瑰,手留余香,您的支持就是我写作最大的动力,感谢您的关注,期待和您一起探讨!再会!

  • 相关阅读:
    uni-app中的数值监控方式及函数的封装和引用方式
    uni-app引入阿里矢量图在移动端不显示的问题
    前端登录页点击获取验证码的实现
    app每次更新版本时调用js代码提示用户下载更新
    @Dependson注解与@ConditionalOnBean注解的区别
    navicat for mysql 12中文破解版(安装+破解)--亲测可用
    Kubernetes 常用命令
    MySQL MERGE存储引擎
    MySQL中MyISAM与InnoDB区别
    什么是事务?什么是事务日志以及用途?
  • 原文地址:https://www.cnblogs.com/axing/p/12747411.html
Copyright © 2020-2023  润新知