找回密码
 立即注册

QQ登录

只需一步,快速开始

adong613

论坛元老

6

主题

33

帖子

1万

积分

论坛元老

积分
14246

活字格认证

adong613
论坛元老   /  发表于:2012-7-18 22:54  /   查看:12429  /  回复:19
1.如果这样绑定,fpSpread1.Sheets[0].DataSource = dsRFilter.Tables[0];
.Columns[string Tag] 这里取得的是空值,那我绑定后得给Tag赋值,

for (int cid = 0; cid < fpSpread1.Sheets[0].ColumnCount; cid++)
{ fpSpread1.Sheets[0].Columns[cid].Tag = fpSpread1.Sheets[0].Columns[cid].DataField; }
int rowCount = dsRFilter.Tables[0].Rows.Count + 1;
请问给.Tag赋值有没有简单的方法或属性?

.Columns[int rowid] 个人不喜欢用这个,因为如果列顺序变了,那程序要改不少地方,
我个人喜欢用.Columns[string colName],只可惜fpSpread1没这个属性,datagridview里有

2.ComboBoxCellType cboCell = new ComboBoxCellType();
DataTable dt1 = bRFilter.GetReport().Tables[0];

cboCell 是不是没有DataSource属性,只能把dt1循环变数组,然后用items属性,
for(int rid=0;rid<dt1.Rows.Count;rid++)
{bytReport[rid]=dt1.Rows[rid][0].ToString();}
cboCell.Items = bytReport;
fpSpread1.Sheets[0].Cells[e.Row, e.Column].CellType = cboCell;
请问有没有简单的方法或属性?

3.fpSpread1.Sheets[0].GetPreferredColumnWidth(cid);
这个只能取得列内容格的最大宽度,可是不包括列标头的,如果列标头很长,内容少,列标头就换行了,有没有方法取得列标头和内容格的最大宽度啊?

19 个回复

倒序浏览
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-7-19 10:30:00
沙发
回答1:
给Column的tag赋值只能一列一列设置,没有一次能够设置所有tag的方法。

回答2:
标准的ComboBoxCellType的Items是string[],如果你习惯与通过DataSource的方式来设置Items,你可以实现一个自定义的ComboBoxCellType类型,然后暴露一个DataSource属性,比如下面的代码:
  1.     public class MyComboBoxCellType : FarPoint.Win.Spread.CellType.ComboBoxCellType
  2.     {
  3.         private DataTable _dataSource;
  4.         public DataTable DataSource
  5.         {
  6.             get { return _dataSource; }
  7.             set {
  8.                 _dataSource = value;
  9.                 // 设置 Items属性
  10.             }
  11.         }
  12.     }
复制代码


回答3:
你可以使用GetPreferredColumnWidth的第2、3个重载方法。
回复 使用道具 举报
adong613
论坛元老   /  发表于:2012-7-20 08:42:00
板凳
刚用spread没多久,按你的方法,问题没解决,不知道是我什么地方没有设置,附demo,请指点,谢谢了
回复 使用道具 举报
adong613
论坛元老   /  发表于:2012-7-20 11:21:00
地板
附Deom

SpreadTest1.rar

47.95 KB, 下载次数: 745

回复 使用道具 举报
adong613
论坛元老   /  发表于:2012-7-20 12:05:00
5#
在求助中心终于找到了个例子,问题终于解决了,贴出共享
            FarPoint.Win.Spread.CellType.ColumnHeaderRenderer renderer = new FarPoint.Win.Spread.CellType.ColumnHeaderRenderer();
            renderer.WordWrap = false;
            fpSpread1.ActiveSheet.ColumnHeader.DefaultStyle.Renderer = renderer;
            fpSpread1.ActiveSheet.Columns[0].Width = fpSpread1.Sheets[0].GetPreferredColumnWidth(0,false);
原来我没有限制标头换行;
不知老师是不是也是这种方法?
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-7-20 15:04:00
6#
是的,列头中的文本默认是换行显示的(与Cell的默认显示方式不同),所以需要先设置列头不换行然后才能计算出正确的宽度。
回复 使用道具 举报
adong613
论坛元老   /  发表于:2012-7-22 10:38:00
7#
再加几个小问题,
4,单元格编辑
默认状态,点一下,单元格获得焦点,然后双击才能编辑(有光标的闪动),现我的想点第一次,单元格获得焦点,然后点一下即单击就可编辑(有光标的闪动)


5,CheckBoxCellType列,选中状态发生改变后,改变另一列的值,我应该写在哪个事件里?

6,在CheckBoxCellType列里,能否取得所有选中状态的行,好像一个数组row[]一样,而不是循环取得

7,筛选器列表项
第一种:
fpSpread1.ActiveSheet.Columns["ReportID"].AllowAutoFilter = true;
筛选器列表项里有:Blanks,NonBlanks
第二种方法:
NamedStyle inStyle = new NamedStyle();
NamedStyle outStyle = new NamedStyle();
inStyle.BackColor = Color.LightCyan;
inStyle.ForeColor = Color.DarkRed;
outStyle.BackColor = Color.LemonChiffon;
outStyle.ForeColor = Color.Green;
FilterColumnDefinition fcd = new FilterColumnDefinition(0, FilterListBehavior.SortByMostOccurrences | FilterListBehavior.DefaultFilter);
StyleRowFilter styleFilter = new StyleRowFilter(fpSpread1.ActiveSheet, inStyle, outStyle);
styleFilter.AddColumn(fcd);
fpSpread1.ActiveSheet.RowFilter = styleFilter;
这种方法,没有Blanks,NonBlanks,但是不需要的项还是显示出来了,只是设置了不同的颜色
要求:像方法一样,但Blanks,NonBlanks不要显示,如何写,请告知
回复 使用道具 举报
adong613
论坛元老   /  发表于:2012-7-22 12:44:00
8#
8,密码列如何设置啊?实际值,和显示值********
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-7-23 15:11:00
9#
4、你需要的功能需要一定的编码才能完成,不过这儿还有另外一种编辑模式,就是第一次点击单元格时就直接进入编辑状态:设置fpSpread1.EditModePermanent = True
5、点击CheckBoxCellType单元格之后会触发ButtonClicked、Change等事件,可以在这些事件中来实现你的其它逻辑
6、只能通过循环该列每一行的单元格来判断是否选中
7、如果希望第二种方式中也显示Blanks,NonBlanks可以使用下面一行代码设置;而第二种方式与第一种的区别也在于是否将过滤掉的数据显示出来,如果希望杯过滤的数据不用显示,可以直接使用第一种方式
  1. FilterColumnDefinition fcd = new FilterColumnDefinition(2, FilterListBehavior.SortByMostOccurrences | FilterListBehavior.DefaultFilter | FilterListBehavior.Blank | FilterListBehavior.NonBlank);
复制代码

8、可以实现一个自定义的CellType
  1.     public class PasswordCellType : FarPoint.Win.Spread.CellType.TextCellType
  2.     {
  3.         public override void PaintCell(Graphics g, Rectangle r, FarPoint.Win.Spread.Appearance appearance, object value, bool isSelected, bool isLocked, float zoomFactor)
  4.         {
  5.             if (value != null)
  6.             {
  7.                 value = "**********";
  8.             }
  9.             appearance.VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center;
  10.             base.PaintCell(g, r, appearance, value, isSelected, isLocked, zoomFactor);
  11.         }
  12.     }
复制代码
回复 使用道具 举报
adong613
论坛元老   /  发表于:2012-7-24 10:47:00
10#
问题7,你没理解我的意思,我是想在方法一的基础上改进,只是筛选器列表项里不想要Blank和NonBlank
总是8,感觉这样不行,你这是改变了value的值了吧,如果再保存到数据库,不是全变成***了吗
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部