当前位置: 首页 > 工具软件 > FlexGrid > 使用案例 >

C#.Net工作笔记018---葡萄城控件FlexGrid自定义单元格_以及给自定义控件添加自定义事件

伏德义
2023-12-01

技术交流QQ群【JAVA,C,.NET,BigData,AI】:170933152  

工作需要,给flexgrid添加自定义类型的单元格,这里自定义了一个radiobutton.

下面这个案例可

以在flexgrid安装后,的samples文件夹中找到,下面是c#的案例.

using C1.Win.C1FlexGrid;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Shopch.Sc.Sp.Player.ShowPlan.SubForm
{
    public class HostedControl
    {
        internal C1FlexGrid _flex;
        internal Control _ctl;
        internal Row _row;
        internal Column _col;

        internal Panel _pnl;
        internal RadioButton RbtControl;

        public delegate void InformHandle(HostedControl sender); //这个部分是自己添加的,自定义事件,给HostedControl

//这个类添加了一个自定义事件
        public event InformHandle RbtClick;//添加了一个自定义事件

        internal HostedControl(C1FlexGrid flex, RadioButton hosted, int row, int col)
        {
            _flex = flex;
            _ctl = hosted;
            _row = flex.Rows[row];
            _col = flex.Cols[col];
            RbtControl = hosted;

            _pnl = new Panel();
            _pnl.Controls.Add(_ctl);
            hosted.Click += new EventHandler(_rbt_Click);//设置当,自定义的控件这里是radiobutton被
            //イベントの実行を追加
            //flex.AfterEdit += new RowColEventHandler(_rbt_Click);
            // ホストされたコントロールをグリッドに追加します。
            _flex.Controls.Add(_pnl);
        }

        public virtual void OnClick()
        {
            if (RbtClick != null)
            {
                RbtClick(this);
            }
        }

        // 通常のスクロールエリアと異なって見せるようにします。(編集時)
        private void _rbt_Click(object sender,EventArgs e)
        {
            OnClick();
        }

        public bool UpdatePosition()
        {
            // 行および列のインデックスを取得します。
            int r = _row.Index;
            int c = _col.Index;
            if (r < 0 || c < 0) return false;

            // セルの位置を取得します。
            Rectangle rc = _flex.GetCellRect(r, c, false);

            // セルに収まらない場合コントロールを非表示します。
            if (rc.Width <= 0 || rc.Height <= 0 || !rc.IntersectsWith(_flex.ClientRectangle))
            {
                _pnl.Visible = false;
                return true;
            }

            // コントロールを表示します。
            _pnl.Bounds = rc;
            _pnl.BackColor = Color.Transparent;
            _ctl.Location = new Point((_pnl.Width - _ctl.Width) / 2, (_pnl.Height - _ctl.Height) / 2);
            _pnl.Visible = true;

            return true;
        }
    }
}

利用上面的这个类,来给flexgrid添加自定义控件:

我这里添加radiobutton

 首先在form类中,添加:全局变量

List<HostedControl> hostedControlList = new List<HostedControl>();

private int RbtTagIndex;

RbtTagIndex 添加这个一个全局变量,在load中,设置为0,用来记录,添加到flexgrid中的自定义控件

 

在进行给单元格赋值的时候:

进行下面的操作:

首先清除原有控件

  hostedControlList.Clear();
 C1flegridTest.Controls.Clear();

 RbtTagIndex = RbtTagIndex + 1;
                var radioBtn = new RadioButton();

  radioBtn = new RadioButton();
                    radioBtn.BackColor = Color.Transparent;
                    radioBtn.Text = "";
                    radioBtn.AutoSize = true;
                    radioBtn.Checked = true;
                    radioBtn.Tag = Convert.ToString(RbtTagIndex) + "-1";

                    HostedControl hostedControlTmp = new HostedControl(C1flexgridTest, radioBtn, i, C1fShowDetail.Cols["TestRbt1"].Index);//把自定义控件添加到某一行,某一列上

    hostedControlTmp.RbtClick += new HostedControl.InformHandle(RbtClickEvent);//给这个自定义控件添加上自定义的事件
                    hostedControlList.Add(hostedControlTmp);

 

然后添加一个事件 来更新,自定义控件的位置:

 private void C1fShowDetail_Paint(object sender, PaintEventArgs e)
        {
            foreach (HostedControl hosted in hostedControlList)
                hosted.UpdatePosition();
        }

 

//下面当点击单元格中的自定义控件的时候,就会自动触发,下面的事件,这样就可以在这个事件中控制,自定义的单元格控件了

   private void RbtClickEvent(HostedControl sender) {
            HostedControl hostedControlTmp = sender;
            String tag = Convert.ToString(hostedControlTmp.RbtControl.Tag);
            String tag0 = tag.Split('-')[0];
            String tag1 = tag.Split('-')[1];
            String tag2 = "";
            String tag3 = "";

            if (tag1.Equals("1")) {
                tag2 = "2";
                tag3 = "3";
            } else if (tag1.Equals("2")) {
                tag2 = "1";
                tag3 = "3";
            }
            else if (tag1.Equals("3"))
            {
                tag2 = "1";
                tag3 = "2";
            }

            String searchStr1 = "";
            String searchStr2 = "";
            searchStr1 = tag0 + "-" + tag2;
            searchStr2 = tag0 + "-" + tag3;

            foreach (HostedControl hosted in hostedControlList) {
                if (Convert.ToString(hosted.RbtControl.Tag).Equals(searchStr1)) {
                    hosted.RbtControl.Checked = false;
                }else if (Convert.ToString(hosted.RbtControl.Tag).Equals(searchStr2))
                {
                    hosted.RbtControl.Checked = false;
                }
            }
        }

 类似资料: