找回密码
 立即注册

QQ登录

只需一步,快速开始

swejet 悬赏达人认证 活字格认证
论坛元老   /  发表于:2014-11-27 16:44  /   查看:15856  /  回复:17
现在想把单元格改变为下拉框的样式,设计器中没发现有这样的功能,找到的例子中要重写GetDrawingObject,没弄明白,该怎么弄才能把单元格变成COMBOBOX的样子

17 个回复

倒序浏览
swejet悬赏达人认证 活字格认证
论坛元老   /  发表于:2014-11-27 16:49:00
沙发
QQ图片20141127164812.jpg (8.07 KB, 下载次数: 1465)
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2014-11-28 11:18:00
板凳
回复 2楼swejet的帖子

可以添加 .NET 标准的 Combox 到 单元格中模拟这种效果:

  1. public partial class MainPage : UserControl
  2.     {
  3.         public MainPage()
  4.         {
  5.             InitializeComponent();
  6.             this.gcSpreadSheet1.Sheets.Clear();
  7.             this.gcSpreadSheet1.Sheets.Add(new MyWorksheet() { RowCount = 10, ColumnCount = 8, DefaultColumnWidth = 100, DefaultRowHeight = 28 });
  8.             var sheet = this.gcSpreadSheet1.ActiveSheet;
  9.             sheet.SetValue(0, 0, "General");
  10.             sheet.SetValue(0, 1, "TextBox");
  11.             sheet.SetValue(0, 2, "Slider");
  12.             sheet.SetValue(0, 3, "DatePicker");
  13.             sheet.SetValue(0, 4, "CheckBox");
  14.             sheet.SetValue(0, 5, "ProgressBar");
  15.             sheet.SetValue(0, 6, "ComboBox");
  16.             sheet.SetValue(0, 7, "Button");
  17.             for (var i = 1; i < 10; i++)
  18.             {
  19.                 sheet.SetValue(i, 2, i);
  20.                 sheet.SetValue(i, 3, DateTime.Now + TimeSpan.FromDays(i * 365));
  21.                 sheet.SetValue(i, 4, i % 2 == 0 ? true : false);
  22.                 sheet.SetValue(i, 5, i);
  23.                 sheet.SetValue(i, 6, i % 3);
  24.             }
  25.             var sheet1 = this.gcSpreadSheet1.ActiveSheet as MyWorksheet;
  26.             if (sheet != null)
  27.             {
  28.                 sheet1.DrawingObjectVisible = true;
  29.                 this.gcSpreadSheet1.InvalidateRange(-1, -1, -1, -1);
  30.             }
  31.         }
  32.     }
  33.     public class ControlDrawingObject : CustomDrawingObject
  34.     {
  35.         private Control _rootElement;
  36.         public ControlDrawingObject(int row, int col, Control control) : base(row, col) { _rootElement = control; this.ShowDrawingObjectOnly = true; }
  37.         public override FrameworkElement RootElement
  38.         {
  39.             get { _rootElement.Margin = new Thickness(1); return _rootElement; }
  40.         }
  41.     }
  42.     public class MyWorksheet : Worksheet
  43.     {
  44.         public bool DrawingObjectVisible { get; set; }
  45.         public override DrawingObject[] GetDrawingObject(int row, int column, int rowCount, int columnCount)
  46.         {
  47.             if (row == 0 || !this.DrawingObjectVisible) return base.GetDrawingObject(row, column, rowCount, columnCount);
  48.             DrawingObject dobj;
  49.             if (column == 7)
  50.             {
  51.                 dobj = new ControlDrawingObject(row, column, new Button() { Content = "Delete" });
  52.             }
  53.             else if (column == 6)
  54.             {
  55.                 int value = -1;
  56.                 object obj = this.GetValue(row, column);
  57.                 if (obj != null)
  58.                 {
  59.                     if (obj is int) value = (int)obj;
  60.                     else
  61.                     {
  62.                         int.TryParse(obj.ToString(), out value);
  63.                     }
  64.                     if (value > 2) value = -1;
  65.                 }
  66.                 ComboBox control = new ComboBox();
  67.                 control.Items.Add("Fruit");
  68.                 control.Items.Add("Vegetable");
  69.                 control.Items.Add("Food");
  70.                 if (value >= -1 &amp;&amp; value < control.Items.Count)
  71.                     control.SelectedIndex = value;
  72.                 control.SelectionChanged += delegate(object sender, SelectionChangedEventArgs e)
  73.                 {
  74.                     this.SetValue(row, column, control.SelectedIndex);
  75.                 };
  76.                 dobj = new ControlDrawingObject(row, column, control);
  77.             }
  78.             else if (column == 5)
  79.             {
  80.                 double value = 0;
  81.                 object obj = this.GetValue(row, column);
  82.                 if (obj != null)
  83.                 {
  84.                     if (obj is double) value = (double)obj;
  85.                     else if (obj is int) value = (int)obj;
  86.                     else
  87.                     {
  88.                         double.TryParse(obj.ToString(), out value);
  89.                     }
  90.                 }
  91.                 dobj = new ControlDrawingObject(row, column, new ProgressBar() { Value = value, Maximum = 10 });
  92.             }
  93.             else if (column == 4)
  94.             {
  95.                 bool value = false;
  96.                 object obj = this.GetValue(row, column);
  97.                 if (obj != null)
  98.                 {
  99.                     if (obj is bool) value = (bool)obj;
  100.                     else
  101.                     {
  102.                         bool.TryParse(obj.ToString(), out value);
  103.                     }
  104.                 }
  105.                 CheckBox control = new CheckBox() { IsChecked = value, Content = "Check Me" };
  106.                 control.Checked += delegate(object sender, RoutedEventArgs e)
  107.                 {
  108.                     this.SetValue(row, column, control.IsChecked);
  109.                 };
  110.                 control.Unchecked += delegate(object sender, RoutedEventArgs e)
  111.                 {
  112.                     this.SetValue(row, column, control.IsChecked);
  113.                 };
  114.                 dobj = new ControlDrawingObject(row, column, control);
  115.             }
  116.             else if (column == 3)
  117.             {
  118.                 DateTime? value = null;
  119.                 object obj = this.GetValue(row, column);
  120.                 if (obj != null)
  121.                 {
  122.                     if (obj is DateTime) value = (DateTime)obj;
  123.                     else
  124.                     {
  125.                         DateTime date;
  126.                         if (DateTime.TryParse(obj.ToString(), out date))
  127.                         {
  128.                             value = date;
  129.                         }
  130.                     }
  131.                 }
  132.                 DatePicker control = new DatePicker() { SelectedDate = value };
  133.                 control.LostFocus += delegate(object sender, RoutedEventArgs e)
  134.                 {
  135.                     this.SetValue(row, column, control.SelectedDate);
  136.                 };
  137.                 dobj = new ControlDrawingObject(row, column, control);
  138.             }
  139.             else if (column == 2)
  140.             {
  141.                 double value = 0;
  142.                 object obj = this.GetValue(row, column);
  143.                 if (obj != null)
  144.                 {
  145.                     if (obj is double) value = (double)obj;
  146.                     else if (obj is int) value = (int)obj;
  147.                     else
  148.                     {
  149.                         double.TryParse(obj.ToString(), out value);
  150.                     }
  151.                 }
  152.                 Slider control = new Slider() { Value = value, Maximum = 10 };
  153.                 control.LostFocus += delegate(object sender, RoutedEventArgs e)
  154.                 {
  155.                     this.SetValue(row, column, control.Value);
  156.                 };
  157.                 dobj = new ControlDrawingObject(row, column, control);
  158.             }
  159.             else if (column == 1)
  160.             {
  161.                 string value = this.GetText(row, column);
  162.                 TextBox control = new TextBox() { Text = value };
  163.                 control.LostFocus += delegate(object sender, RoutedEventArgs e)
  164.                 {
  165.                     this.SetValue(row, column, control.Text);
  166.                 };
  167.                 dobj = new ControlDrawingObject(row, column, control);
  168.             }
  169.             else
  170.             {
  171.                 return base.GetDrawingObject(row, column, rowCount, columnCount);
  172.             }
  173.             return new DrawingObject[] { dobj };
  174.         }
  175.     }
复制代码
回复 使用道具 举报
swejet悬赏达人认证 活字格认证
论坛元老   /  发表于:2014-11-28 11:21:00
地板
我是直接打开EXCEL文件进行编辑,如果Clear掉所有Sheet数据不就丢失了嘛,有没有别的解决方法啊,在原有的Sheet中添加Combobox
回复 使用道具 举报
swejet悬赏达人认证 活字格认证
论坛元老   /  发表于:2014-11-28 15:42:00
5#
回复 3楼iceman的帖子

我是直接打开EXCEL文件进行编辑,如果Clear掉所有Sheet数据不就丢失了嘛,有没有别的解决方法啊,在原有的Sheet中添加Combobox
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2014-11-28 17:39:00
6#
回复 5楼swejet的帖子

3# 的例子用于说明可以嵌入 Combo 到Cell中,当然您在设置之前也可以不清除表单,直接设置单元格类型即可。
回复 使用道具 举报
swejet悬赏达人认证 活字格认证
论坛元老   /  发表于:2014-11-28 17:51:00
7#
回复 6楼iceman的帖子

Silverlight怎直接设置单元格类型?具体例子代码有吗?
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2014-12-1 19:29:00
8#
回复 7楼swejet的帖子

抱歉,让您久等了。

和您确认下需求,目前希望在导入 Excel 后,某个单元格保留原来的文本,但是需要设置单元格类型为 Combo 对吗?

DrawingObject 是绘制到单元格中的,如果单元格之前存在文本则需要把当前单元格value添加到 Combo 文本中。

在确认您的需求后我这边会尝试制作 Demo 上传。
谢谢
回复 使用道具 举报
swejet悬赏达人认证 活字格认证
论坛元老   /  发表于:2014-12-2 09:50:00
9#
回复 8楼iceman的帖子

我用的是Silverlight平台,单元格可能为空也可能不为空,但是要的是在原有的Sheet上添加。希望能解决
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2014-12-2 15:28:00
10#
回复 9楼swejet的帖子

我们正在沟通开发人员问您制作这个 demo,完成后会第一时间发送给您。谢谢
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部