找回密码
 立即注册

QQ登录

只需一步,快速开始

Zoe
银牌会员   /  发表于:2013-4-3 11:35:00
11#
>>现有的列类型 如何限制长度以及录入的类型?
录入类型,通过Formatter来设置,
这个和Excel的使用方法相同。
限制长度,是使用DataValidator 功能实现的,使用方法也和Excel的DataValidator 相同。
  1. double dvalue = 12345.6789;      
  2. gcSpreadSheet1.Sheets[0].Cells[0, 0].Formatter = new GrapeCity.Windows.SpreadSheet.Data.GeneralFormatter(GrapeCity.Windows.SpreadSheet.Data.FormatMode.StandardNumericMode, "c");
  3. gcSpreadSheet1.Sheets[0].Cells[0, 0].Value = dvalue;
  4. gcSpreadSheet1.Sheets[0].Cells[0, 1].Formatter = new GrapeCity.Windows.SpreadSheet.Data.GeneralFormatter(GrapeCity.Windows.SpreadSheet.Data.FormatMode.StandardDateTimeMode, "M");
  5. gcSpreadSheet1.Sheets[0].SetValue(0, 1, new DateTime(2011, 2, 9));
  6. gcSpreadSheet1.Sheets[0].Cells[0, 2].Formatter = new GrapeCity.Windows.SpreadSheet.Data.GeneralFormatter("m");
  7. gcSpreadSheet1.Sheets[0].SetValue(0, 2, new DateTime(2012, 10, 15));
  8. gcSpreadSheet1.Sheets[0].Cells[0, 3].Formatter = new GrapeCity.Windows.SpreadSheet.Data.GeneralFormatter();
  9. gcSpreadSheet1.Sheets[0].SetValue(0, 3, new DateTime(2012, 10, 15));
  10. gcSpreadSheet1.Sheets[0].Cells[0, 4].Formatter = new GrapeCity.Windows.SpreadSheet.Data.GeneralFormatter(GrapeCity.Windows.SpreadSheet.Data.FormatMode.CustomMode, "#.#%");
  11. gcSpreadSheet1.Sheets[0].SetValue(0, 4, 1);
  12. gcSpreadSheet1.Sheets[0].Cells[1, 0].Formatter = new GrapeCity.Windows.SpreadSheet.Data.GeneralFormatter(GrapeCity.Windows.SpreadSheet.Data.FormatMode.CustomMode, "[>2]0.0;[<-3]0.0;zero;");
  13. gcSpreadSheet1.Sheets[0].SetValue(1, 0, 3);
  14. gcSpreadSheet1.Invalidate();
复制代码
  1.   this.gcSpreadSheet1.ActiveSheet.Columns[0].DataValidator = DataValidator.CreateTextLengthValidator(ComparisonOperator.LessThan, 10, null);
  2.             this.gcSpreadSheet1.ValidationError += new EventHandler<GrapeCity.Windows.SpreadSheet.UI.ValidationErrorEventArgs>(gcSpreadSheet1_ValidationError);
  3. void gcSpreadSheet1_ValidationError(object sender, GrapeCity.Windows.SpreadSheet.UI.ValidationErrorEventArgs e)
  4.         {
  5.             MessageBox.Show("The text length is invalid, please  try again");
  6.         }
复制代码
回复 使用道具 举报
gaoge00
论坛元老   /  发表于:2013-4-3 13:01:00
12#
回复 10楼Zoe的帖子

/// <summary>
    /// WinGCTest.xaml 的交互逻辑
    /// </summary>
    public partial class WinGCTest : Window
    {
        public WinGCTest()
        {
            InitializeComponent();
            this.sheet1.Sheets.Clear();
            //定义一个放置Control的集合
            List<MyControl> listControls = new List<MyControl>();
            //定义一个按钮类型
            Button btn = new Button() { Content = "Click Me" };
            //定义一个事件
            btn.Click += new RoutedEventHandler(btn_Click);
            //生命一个MyControl类型的实体
            MyControl mcontrol = new MyControl() { MyControlName = "Button", MyControlType = btn };
            //添加到listControls中
            listControls.Add(mcontrol);
            this.sheet1.Sheets.Add(new MyWorkSheet() { RowCount = 10, ColumnCount = 1, DefaultColumnWidth = 100, DefaultRowHeight = 28, listControls = listControls });
            var sheet = this.sheet1.ActiveSheet;
            var sheet1 = this.sheet1.ActiveSheet as MyWorkSheet;
            if (sheet != null)
            {
                sheet1.DrawingObjectVisible = true;
                this.sheet1.InvalidateRange(-1, -1, -1, -1);
            }
        }

        void btn_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("这是ButtonClick事件");
        }
    }


    public class MyControl : Control
    {
        public MyControl() : base() { }
        public string MyControlName { get; set; }
        public Control MyControlType { get; set; }
    }

    public class ControlDrawingObject : CustomDrawingObject
    {
        private Control _rootElement;
        public ControlDrawingObject(int row, int col, Control control) : base(row, col) { _rootElement = control; this.ShowDrawingObjectOnly = true; }
        public override FrameworkElement RootElement
        {
            get { _rootElement.Margin = new Thickness(1); return _rootElement; }
        }
    }


    public class MyWorkSheet : Worksheet
    {
        public bool DrawingObjectVisible { get; set; }
        public List<MyControl> listControls { get; set; }
        

        public override DrawingObject[] GetDrawingObject(int row, int column, int rowCount, int columnCount)
        {
            DrawingObject dobj;


            switch (listControls[column].MyControlName)
            {
                case "Button":
                    //Button btnDelete = new Button() { Content = "Delete" };
                    Button btnDelete = listControls[column].MyControlType as Button;
                    dobj = new ControlDrawingObject(row, column, btnDelete);
                    return new DrawingObject[] { dobj };
                default:
                    return base.GetDrawingObject(row, column, rowCount, columnCount);

            }
        }
    }
回复 使用道具 举报
Zoe
银牌会员   /  发表于:2013-4-3 14:50:00
13#
回复 12楼gaoge00的帖子

您的代码执行结果只有最后一行才有结果的原因是因为:
同一个实例被添加到多个cell容器里,所以只有最后一个才显示。
我修改了一下您的代码, 每次创建新的实例去添加到一个cell 容器中,就可以工作正常了。
  1. this.gcSpreadSheet1.Sheets.Clear();         
  2.             MyWorkSheet sheet2 = new MyWorkSheet() { RowCount = 10, ColumnCount = 1, DefaultColumnWidth = 100, DefaultRowHeight = 28};
  3.             sheet2.Columns[0].Tag = &quot;Button&quot;;
  4.             this.gcSpreadSheet1.Sheets.Add(sheet2);
  5.             var sheet1 = this.gcSpreadSheet1.ActiveSheet as MyWorkSheet;
  6.             if (sheet1 != null)
  7.             {
  8.                 sheet1.DrawingObjectVisible = true;
  9.                 this.gcSpreadSheet1.InvalidateRange(-1, -1, -1, -1);
  10.             }
  11.   public class ControlDrawingObject : CustomDrawingObject
  12.         {
  13.             private Control _rootElement;
  14.             public ControlDrawingObject(int row, int col, Control control) : base(row, col) { _rootElement = control; this.ShowDrawingObjectOnly = true; }
  15.             public override FrameworkElement RootElement
  16.             {
  17.                 get { _rootElement.Margin = new Thickness(1); return _rootElement; }
  18.             }
  19.         }
  20.         public class MyWorkSheet : Worksheet
  21.         {
  22.             public bool DrawingObjectVisible { get; set; }
  23.             public override DrawingObject[] GetDrawingObject(int row, int column, int rowCount, int columnCount)
  24.             {
  25.                 DrawingObject dobj;
  26.                 switch (this.Columns[column].Tag.ToString())
  27.                 {
  28.                     case &quot;Button&quot;:
  29.                         Button btnDelete = CreateCustomControl(&quot;Button&quot;) as Button;
  30.                         dobj = new ControlDrawingObject(row, column, btnDelete);
  31.                         return new DrawingObject[] { dobj };
  32.                     default:
  33.                         return base.GetDrawingObject(row, column, rowCount, columnCount);
  34.                 }
  35.             }
  36.             private Control CreateCustomControl(string name)
  37.             {
  38.                 switch (name)
  39.                 {
  40.                     case &quot;Button&quot;:
  41.                         Button btnDelete = new Button() { Content = &quot;Delete&quot; };
  42.                         btnDelete.Click += delegate(object sender, RoutedEventArgs e)
  43.            {
  44.                MessageBox.Show(&quot;这是ButtonClick事件&quot;);
  45.            };
  46.                         return btnDelete;
  47.                     default:
  48.                         return new TextBox();
  49.                 }
  50.             }
  51.         }
复制代码
回复 使用道具 举报
gaoge00
论坛元老   /  发表于:2013-4-3 16:07:00
14#
回复 13楼Zoe的帖子

是这样的,是想写一个共通的类, 这样大家把自己的类型,事件,属性,数据绑定都写好之后通过一个List传进来,然后我读取这个List中的Control ,主要就是想重用这些代码。。。。现在看来好像不行,谢谢你。先这样用着吧,谢谢您。。。
回复 使用道具 举报
gaoge00
论坛元老   /  发表于:2013-4-5 09:19:00
15#
回复 13楼Zoe的帖子

您好,今天在用您的方法改写的时候,发现一些问题,比如说,我自定义的一些控件是不受原Spread的控制的,比如设置Spread 列的水平,垂直 对齐,比如说列锁定,锁定后文本框,下拉列表等都是可以使用的。。。请问有没有办法解决?
回复 使用道具 举报
gaoge00
论坛元老   /  发表于:2013-4-5 13:16:00
16#
回复 13楼Zoe的帖子

这样设置自定义列类型以后如何绑定数据呢?比如我将一个DataTable绑定到该Sheet中,Sheet中有DatePicker,CheckBox等
回复 使用道具 举报
Zoe
银牌会员   /  发表于:2013-4-8 18:07:00
17#
回复 15楼gaoge00的帖子

这些都要自定义控件支持这些属性,并且自己去写代码实现的。目前产品没有支持这个功能。
回复 使用道具 举报
Zoe
银牌会员   /  发表于:2013-4-8 18:10:00
18#
回复 16楼gaoge00的帖子

这个可以在数据绑定后,参考我给出的第一例子里面的GetValue 和SetValue 去实现。

  1. //CheckBox
  2. bool value = false;
  3.                 object obj = this.GetValue(row, column);
  4.                 if (obj != null)
  5.                 {
  6.                     if (obj is bool) value = (bool)obj;
  7.                     else
  8.                     {
  9.                         bool.TryParse(obj.ToString(), out value);
  10.                     }
  11.                 }
  12.                 CheckBox control = new CheckBox() { IsChecked = value, Content = &quot;Check Me&quot; };
  13.                 control.Checked += delegate(object sender, RoutedEventArgs e)
  14.                 {
  15.                     this.SetValue(row, column, control.IsChecked);
  16.                 };
  17.                 control.Unchecked += delegate(object sender, RoutedEventArgs e)
  18.                 {
  19.                     this.SetValue(row, column, control.IsChecked);
  20.                 };
  21.                 dobj = new ControlDrawingObject(row, column, control);


  22. //DateTimePicker
  23. DateTime? value = null;
  24.                 object obj = this.GetValue(row, column);
  25.                 if (obj != null)
  26.                 {
  27.                     if (obj is DateTime) value = (DateTime)obj;
  28.                     else
  29.                     {
  30.                         DateTime date;
  31.                         if (DateTime.TryParse(obj.ToString(), out date))
  32.                         {
  33.                             value = date;
  34.                         }
  35.                     }
  36.                 }
  37.                 DatePicker control = new DatePicker() { SelectedDate = value };
  38.                 control.LostFocus += delegate(object sender, RoutedEventArgs e)
  39.                 {
  40.                     this.SetValue(row, column, control.SelectedDate);
  41.                 };
  42.                 dobj = new ControlDrawingObject(row, column, control);
复制代码
回复 使用道具 举报
qd98zhq
论坛元老   /  发表于:2014-11-15 10:37:00
19#
请问以上的 这个继承的类 CustomDrawingObject 命名空间是哪个呀,我引用不进来,找不到这个类,谢谢解答。
回复 使用道具 举报
qd98zhq
论坛元老   /  发表于:2014-11-15 10:43:00
20#
哦,明白了,是要自己自定义扩展的。不好意思,没注意看呢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部