找回密码
 立即注册

QQ登录

只需一步,快速开始

wotangjing

论坛元老

38

主题

97

帖子

7041

积分

论坛元老

积分
7041

活字格认证

wotangjing
论坛元老   /  发表于:2013-5-28 10:31  /   查看:12232  /  回复:10
产品版本:7.0        产品模块:winfor        操作系统:win7 64位        IDE:VS2012
问题描述:如下图所示,在一个表格内实现多个类型的组合.此示例为一个标签两个选择框.

2013-5-28 10-28-41.png
1.能否控制选择框的互斥或者多选.
2.当选择一个框时可否触发事件?
3.对选择框的结果通过属性能获取到选择值吗?
4.最好能有灵活的方法传参数,因为可能选择框不止两个?

10 个回复

倒序浏览
wotangjing
论坛元老   /  发表于:2013-5-28 10:33:00
沙发
补充一句谢谢大家!支持Sread产品走向更好.
回复 使用道具 举报
Ally
葡萄城公司职员   /  发表于:2013-5-28 14:55:00
板凳
您好!
一般情况下要实现多选项间的互斥应该选择使用MultiOptionCellType。其使用方法如下:
public Form1()
        {
            InitializeComponent();
            fpSpread1.EditModeOn += fpSpread1_EditModeOn;
            MultiOptionCellType mo1 = new MultiOptionCellType();
            mo1.Orientation = FarPoint.Win.RadioOrientation.Horizontal;
            mo1.Items = new String[] { "赤色", "緑色", "青色" };
            mo1.EditorValue = FarPoint.Win.Spread.CellType.EditorValue.Index;
            fpSpread1.ActiveSheet.Cells[1, 1].CellType = mo1;
        }

        void fpSpread1_EditModeOn(object sender, EventArgs e)
        {
            FpMultiOption editor = (FpMultiOption)fpSpread1.EditingControl;
            editor.ValueChanged += editor_ValueChanged;
        }
        void editor_ValueChanged(object sender, EventArgs e)
        {
            if ((sender as FpMultiOption).Value == 0)
            {
                fpSpread1.ActiveSheet.Cells[0, 0].BackColor = Color.Red;
            }
            if ((sender as FpMultiOption).Value == 1)
            {
                fpSpread1.ActiveSheet.Cells[0, 0].BackColor = Color.Green;
            }
            if ((sender as FpMultiOption).Value == 2)
            {
                fpSpread1.ActiveSheet.Cells[0, 0].BackColor = Color.Yellow;
            }
        }
当cell进入编辑状态时就可以得到EditingControl,EditingControl就是FpMultiOption类型,当选择一个值时就触发ValueChanged事件。可以通过Value属性得到选择值。

要实现多选项间的多选可选择CheckBoxCellType,其用法如下:
public Form1()
        {
            InitializeComponent();
            fpSpread1.EditModeOn += fpSpread1_EditModeOn;
            CheckBoxCellType check = new CheckBoxCellType();
            check.Caption = "男";
            fpSpread1.ActiveSheet.Cells[2, 2].CellType = check;
        }

        void fpSpread1_EditModeOn(object sender, EventArgs e)
        {
            FpCheckBox editor = (FpCheckBox)fpSpread1.EditingControl;
            editor.CheckChanged += editor_CheckChanged;
        }

        void editor_CheckChanged(object sender, EventArgs e)
        {
            if((sender as FpCheckBox).CheckState == CheckState.Checked)
            {
                fpSpread1.ActiveSheet.Cells[0, 0].BackColor = Color.Red;
            }
            if ((sender as FpCheckBox).CheckState == CheckState.Unchecked)
            {
                fpSpread1.ActiveSheet.Cells[0, 0].BackColor = Color.Green;
            }
            if ((sender as FpCheckBox).CheckState == CheckState.Indeterminate)
            {
                fpSpread1.ActiveSheet.Cells[0, 0].BackColor = Color.Yellow;
            }

        }
回复 使用道具 举报
wotangjing
论坛元老   /  发表于:2013-5-28 15:41:00
地板

创建自定义的节点单元格类型

回复 3楼Ally的帖子

谢谢你的回复,不过我主要是想在一个单元格内实在多个类型的组合.此示例为一个标签两个选择框.
1.自定义单元格类型CellTye传参数构造函数(标签内容,选择框数组(选择框的标题),布尔值(互斥或多选))
2.选择事件的响应
3.该单元格内结果值的获取
(备注:多选的效果就和互斥一样,只是简单的一个单元格类型MultiOptionCellType,当然此时互斥时也应该包含标签内容)
回复 使用道具 举报
Ally
葡萄城公司职员   /  发表于:2013-5-28 15:55:00
5#
这种情况下不建议使用CellType,因为一个单元格的值最好是简单类型,不宜复杂类型,不然保存逻辑过于复杂。建议自定义UserControl,让UserControl实现以上功能,然后将UserControl作为Spread的ChildControl.
回复 使用道具 举报
wotangjing
论坛元老   /  发表于:2013-5-28 16:32:00
6#
回复 5楼Ally的帖子

在此我还有两点疑问:
1.互斥选择使用MultiOptionCellType,如何添加标签内容呢?
2.在Spread中使用UserControl作为Spread的ChildControl不太明白,能给个简单的示例说明吗?
非常感谢!
回复 使用道具 举报
Ally
葡萄城公司职员   /  发表于:2013-5-29 10:23:00
7#
回复6楼的帖子
1. 无法给MultiOptionCellType添加标签,没有提供这样的属性。
2. 在Spread中使用UserControl作为Spread的ChildControl的方法:
public class SpreadTextBox : TextBox, FarPoint.Win.Spread.DrawingSpace.IEmbeddedControlSupport
        {
            private FarPoint.Win.Spread.DrawingSpace.Moving moving = Moving.None;
            private FarPoint.Win.Spread.DrawingSpace.Sizing sizing = Sizing.None;
            private FarPoint.Win.Spread.DrawingSpace.ChildActivationPolicy activation = ChildActivationPolicy.DoubleClick;
            public virtual FarPoint.Win.Spread.DrawingSpace.ChildActivationPolicy ActivationPolicy
            {
                get
                {
                    return activation;
                }
                set
                {
                }
            }
            public virtual FarPoint.Win.Spread.DrawingSpace.Moving CanMove
            {
                get
                {
                    return moving;
                }
                set
                {
                    moving = value;
                }
            }
            public virtual FarPoint.Win.Spread.DrawingSpace.Sizing CanSize
            {
                get
                {
                    return sizing;
                }
                set
                {
                    sizing = value;
                }
            }
            public void ControlPaint(Graphics g, Rectangle r, FarPoint.Win.Spread.Appearance appearance, object value, bool isSelected,
            bool isLocked, float zoomFactor)
            {
                g.SetClip(r, CombineMode.Intersect);
                g.FillRectangle(new SolidBrush(this.BackColor), r);
                g.DrawString(this.Text, Font, new SolidBrush(this.ForeColor), r.X, r.Y);
                this.TextChanged += new EventHandler(MeTextChanged);
            }
            public void MeTextChanged(object sender, EventArgs e)
            {
                this.BackColor = Color.Beige;
            }
        }
public Form1()
        {
            SpreadTextBox tb = new SpreadTextBox();
            tb.Name = "TB";
            fpSpread1.ActiveSheet.AddControl(tb, 2, 2);
        }
从您的需求看,您只能重新写UserControl了。
回复 使用道具 举报
wotangjing
论坛元老   /  发表于:2013-5-29 16:03:00
8#
回复 7楼Ally的帖子

感谢指导,不过我还有一个疑问,就是添加UserControl后如何使其初始化并一直显示在单元格内,难道需要ControlPaint?如果真是这样,那该怎么做,有没有什么简洁的方法?
可参考我写的示例来补充说明!
WindowsFormsApplicationSpreadDemo.zip (890.31 KB, 下载次数: 1336)
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-6-3 15:13:00
9#
回复 8楼wotangjing的帖子

建议通过合并列头单元格的方式实现。
测试代码如下:

  1. private void Form1_Load(object sender, EventArgs e)
  2.         {
  3.             FarPoint.Win.Spread.CellType.CheckBoxCellType cktype = new FarPoint.Win.Spread.CellType.CheckBoxCellType();
  4.             cktype.TextAlign = FarPoint.Win.ButtonTextAlign.TextRightPictLeft;
  5.             cktype.Caption = "男";

  6.             FarPoint.Win.Spread.CellType.CheckBoxCellType cktype1 = new FarPoint.Win.Spread.CellType.CheckBoxCellType();
  7.             cktype1.TextAlign = FarPoint.Win.ButtonTextAlign.TextRightPictLeft;
  8.             cktype1.Caption = "女";

  9.             this.fpSpread1.Sheets[0].Cells[0, 1].CellType = cktype;
  10.             this.fpSpread1.Sheets[0].Cells[0, 2].CellType = cktype1;

  11.             this.fpSpread1.Sheets[0].Cells[0, 0].ForeColor = System.Drawing.Color.Red;
  12.             this.fpSpread1.Sheets[0].Cells[0, 0].Text = "性别";

  13.             this.fpSpread1.Sheets[0].ColumnHeader.Cells[0, 0].ColumnSpan = 3;

  14.             this.fpSpread1.Sheets[0].Columns[0].Border = new FarPoint.Win.LineBorder(Color.Gray, 1, true, true, false, true);
  15.             this.fpSpread1.Sheets[0].Columns[1].Border = new FarPoint.Win.LineBorder(Color.Gray, 1, false, true, false, true);
  16.             this.fpSpread1.Sheets[0].Columns[2].Border = new FarPoint.Win.LineBorder(Color.Gray, 1, false, true, true, true);
  17.         }
复制代码
回复 使用道具 举报
wotangjing
论坛元老   /  发表于:2013-6-4 11:36:00
10#
回复 9楼iceman的帖子

iceman的回答实在让人难以满意,不知道有没有仔细看我的需求?
虽然现在是免费试用,使用时间也不长很多不懂,我相信你们比我强的多.
Ally人呢?我觉得他应该能更能明白.
最后还是一样表示感谢!最近可能不会纠结这个问题了.
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部