← 返回所有博客文章

概述

本文主要是将以往我们论坛,售后解决的常见的经典问题,整合成一个问题集锦,里面讲述开发者在开发过程中遇到的一些问题,希望能帮助更多的开发人员。

经典一:

应用场景:

Q;我现在想实现获取的选取多个单元格的,并且将他们内面数据合计显示,对于选取的单元集合怎么确定?

A:我们可以通过Selection来确定我们的选择范围,具体见如下实现:

   1:  private void c1FlexGrid1_MouseUp(object sender, MouseEventArgs e)
   2:          {
   3:              int sum = 0;
   4:              for (int i = c1FlexGrid1.Selection.r1; i <= c1FlexGrid1.Selection.r2; i++)
   5:              {
   6:                  for (int j = c1FlexGrid1.Selection.c1; j <= c1FlexGrid1.Selection.c2; j++)
   7:                  {
   8:                      //if (this.c1FlexGrid1.Selection.Contains(i, j))
   9:                      if (this.c1FlexGrid1.IsCellSelected(i, j))
  10:                      {
  11:                          sum += int.Parse(c1FlexGrid1[i, j].ToString());
  12:                      }
  13:                  }
  14:              }
  15:              MessageBox.Show(sum.ToString());
  16:          }

运行出来的结果如下;

image

Tips: c1flexgrid当.selectionmode=listbox时才用flex.rows.selected判断,否则用flex.selection判断;

经典二:

应用场景:

Q:我想在FlexGrid下,指定单元格可以编辑,由其他的单元格决定该单元格是否可以编辑?

A:当然可以,我们可以通过在加载窗体的时候,给BeforeEdit事件增加单元格可读属性,

具体代码如下:

   1:   this.c1FlexGrid1.BeforeEdit += (s1, e1) =>
   2:                  {
   3:                     var flex = s1 as C1.Win.C1FlexGrid.C1FlexGrid;
   4:                      if (业务逻辑判断)
   5:                          e1.Cancel = true;
   6:                   };

此时,满足条件的单元格都是只读。

还有一种在OwnerDrawCell事件中直接设置属性,前提是设置this.c1FlexGrid1的DrawMode属性

这样控件在渲染的时候回遍历每一个单元格,这样也能达到目的。

经典三:

应用场景:

Q:在FlexGrid是否提供指定单元格样式自定义的方法,比如我的需要的是对于特殊的单元我需要自定背景色,字体,背景图等

A:回答是当然可以,而且我们为了更灵活的设计表格,提供了自定义样式的方法,首先我们要做一个自定义的样式:

   1:  c1FlexGrid1.Styles.Add("myCustom1");
   2:  c1FlexGrid1.Styles["myCustom1"].BackColor = Color.Red;
   3:  c1FlexGrid1.Styles["myCustom1"].Font = new Font(c1FlexGrid1.Styles.Normal.Font.Name, 11);
   4:  c1FlexGrid1.Styles.Add("myCustom2");
   5:  c1FlexGrid1.Styles["myCustom2"].BackColor = Color.Orange;
   6:  c1FlexGrid1.Styles["myCustom2"].Font = new Font(c1FlexGrid1.Styles.Normal.Font.Name, 10);
   7:  c1FlexGrid1.Styles.Add("myCustom3");
   8:  c1FlexGrid1.Styles["myCustom3"].BackColor = Color.Yellow;
   9:  c1FlexGrid1.Styles["myCustom3"].Font = new Font(c1FlexGrid1.Styles.Normal.Font.Name, 9);
  10:  c1FlexGrid1.AutoSizeCols();
  11:  c1FlexGrid1.VisualStyle = C1.Win.C1FlexGrid.VisualStyle.Office2007Blue;
  12:  this.BackColor = Color.FromArgb(191, 219, 255);

这是三个单元格样式,我们现在要完成的目标是,对库存量做一个三种数量的范围的区分,对于某单元格值在某个范围,就给它应用相应的样式

   1:  private void c1FlexGrid1_OwnerDrawCell(object sender, OwnerDrawCellEventArgs e)
   2:  {
   3:  if (c1FlexGrid1.Cols[e.Col].Name == "UnitsInStock" && e.Row > 0)
   4:  {
   5:  int tmp;
   6:  tmp = int.Parse(c1FlexGrid1[e.Row, e.Col].ToString());
   7:  if (tmp < 10)
   8:  {
   9:  e.Style = c1FlexGrid1.Styles["myCustom1"];
  10:  }
  11:  else if (tmp < 50)
  12:  {
  13:  e.Style = c1FlexGrid1.Styles["myCustom2"];
  14:  }
  15:  else if (tmp < 100)
  16:  {
  17:  e.Style = c1FlexGrid1.Styles["myCustom3"];
  18:  }
  19:  }
  20:  }

如此我们得到了这样的效果:

image

通过这样方法我们可以在OwnerDrawCell事件中来判断某个单元格是否满足你设定的某些条件,以及应用什么的样式,从而达到样式自定义。

后续我还会继续整理一些经典案例和大家一起分享,希望能帮助到大家。

如果你有疑问,可以到GCDN获得技术支持:

http://gcdn.grapecity.com.cn/showforum-68.html

GCDNhttp://gcdn.grapecity.com.cn/

官方网站/developer