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

技术交流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;
                }
            }
        }

注意:VS版本要是2008.采用有用的新属性和新方法,按最适合您和您用户的方式来查看数据!例如,您可以采用Subtotal方法来汇总数据并添加总计值以及使用Tree属性显示数据层次视图。 增强单元格编辑功能 使用简单文本编辑,下拉列表和组合框列表,单元按钮,掩码,以及高级数据验证来控制编辑过程。例如,您可使用一个输入掩码来提供自动验证用户输入数据的模板,或选择防止用户编辑特定列。 更好的绘图 通过绘制特殊效果如在适当网格单元内绘制直线,位图以及图标,能让网格显示出您所希望的样式。该版本新增的特性包括变比例图像和透明度。 更简单,更强大的对象模型 您可以通过改变常用样式(或定义自己的类型)并且将他们赋值给行,列或任意单元范围,而不需要使用ActiveX控件的多重属性就可定制网格的显示。新的对象模型取代了它们,并使进程更加高效! 强大的设计时支持 我们使在设计时执行决策更加简单。例如,您可以在设计时使用易用的样式编辑对话框,而不需要编写代码在运行时执行,从而方便的设置样式。 应用场景 运用优势 绑定和非绑定模式以及定制数据源 使用绑定模式的网格时,它将显示ADO.NET数据源获得的数据,而在非绑定模式时,网格本身就可以管理数据。您只需要:绑定网格到一个现存的数据结构,使用经过计算的";;;虚拟";;;字段,执行数据检验和按要求加载数据。 综合打印 使用一条语句即可打印网格!您可以控制纸张方向,页边距以及页脚文字,或者您可以显示一个对话框来让您的用户选择或设置打印机。打印事件允许您控制分页符,添加重复标题行或为每一页添加定制元素。 映射的图像列表 绑定网格列到图像列表是一种方便,高效的按图像方式显示数据库信息的方法。 列引用 如果需要,可以通过名称而不是位置来引用列。当网格是数据绑定时,列关键字是自动分配给字段名称,或者您也可以采用代码来对它们进行赋值。然后,您可以使用ColIndes(ColKey)语法来引用一列,即使用户已经将其移动到网格上不同的位置,也能检索到您需要的列。 区域合计 仅仅使用一条语句便可对单元区域计算合计,平均值以及其它统计信息。 合并单元格 合并邻近值相同的单元格,使他们跨越多行或列,以增强外观显示和清晰度。
摘要 ComponentOne FlexGrid for .NET 综合了最新的数据绑定技术-ADO.NET,能与Microsoft .NET框架无缝集成。因此,您能获得一个容易使用而且非常健壮的网格控件来创建用户友好界面,并且显示,编辑,格式化,组织,汇总以及打印表格数据! 技术特性 分层显示样式 采用有用的新属性和新方法,按最适合您和您用户的方式来查看数据!例如,您可以采用Subtotal方法来汇总数据并添加总计值以及使用Tree属性显示数据层次视图。 增强单元格编辑功能 使用简单文本编辑,下拉列表和组合框列表,单元按钮,掩码,以及高级数据验证来控制编辑过程。例如,您可使用一个输入掩码来提供自动验证用户输入数据的模板,或选择防止用户编辑特定列。 更好的绘图 通过绘制特殊效果如在适当网格单元内绘制直线,位图以及图标,能让网格显示出您所希望的样式。该版本新增的特性包括变比例图像和透明度。 更简单,更强大的对象模型 您可以通过改变常用样式(或定义自己的类型)并且将他们赋值给行,列或任意单元范围,而不需要使用ActiveX控件的多重属性就可定制网格的显示。新的对象模型取代了它们,并使进程更加高效! 强大的设计时支持 我们使在设计时执行决策更加简单。例如,您可以在设计时使用易用的样式编辑对话框,而不需要编写代码在运行时执行,从而方便的设置样式。 应用场景 运用优势 绑定和非绑定模式以及定制数据源 使用绑定模式的网格时,它将显示ADO.NET数据源获得的数据,而在非绑定模式时,网格本身就可以管理数据。您只需要:绑定网格到一个现存的数据结构,使用经过计算的";;;虚拟";;;字段,执行数据检验和按要求加载数据。 综合打印 使用一条语句即可打印网格!您可以控制纸张方向,页边距以及页脚文字,或者您可以显示一个对话框来让您的用户选择或设置打印机。打印事件允许您控制分页符,添加重复标题行或为每一页添加定制元素。 映射的图像列表 绑定网格列到图像列表是一种方便,高效的按图像方式显示数据库信息的方法。 列引用 如果需要,可以通过名称而不是位置来引用列。当网格是数据绑定时,列关键字是自动分配给字段名称,或者您也可以采用代码来对它们进行赋值。然后,您可以使用ColIndes(ColKey)语法来引用一列,即使用户已经将其移动到网格上不同的位置,也能检索到您需要的列。 区域合计 仅仅使用一条语句便可对单元区域计算合计,平均值以及其它统计信息。 合并单元格 合并邻近值相同的单元格,使他们跨越多行或列,以增强外观显示和清晰度。 开发环境 VB .NET/C# .NET 支持平台 Windows2000/XP 电话 021-58549800 Email: tools@sh.grapecity.com http://www.grapecity.com/china
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

添柴程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值