自己找出来2个对付用办法 求鉴定.
方法一 利用spread的ComboDropDown 事件 在MultiColumnEditor弹出之前设置列宽
缺点:这样做每次都会检查和设置,影响form刷新效率
this.FpSpread_fptool.ComboDropDown += new FarPoint.Win.Spread.EditorNotifyEventHandler(this.FpSpread_fptool_ComboDropDown);
private void FpSpread_fptool_ComboDropDown(object sender, EditorNotifyEventArgs e)
{
((FpSpread)(((MultiColumnEditor)e.EditingControl).SubEditor)).ActiveSheet.Columns[1].Width = 0;
}
方法二: 继承MultiColumnEditor,自定义列宽
继承 并在InitializeEditorControl时候设置列宽
定义新类(继承MultiColumnEditor)
class mcbtype_SetColumnWidth : FarPoint.Win.Spread.CellType.MultiColumnComboBoxCellType
{
public float[] widths;
public mcbtype_SetColumnWidth()
{
}
public override void InitializeEditorControl(Control control, FarPoint.Win.Spread.Appearance appearance, float zoomFactor)
{
base.InitializeEditorControl(control, appearance, zoomFactor);
if (widths != null && ((MultiColumnEditor)control).SubEditor != null && ((FarPoint.Win.Spread.CellType.MultiColumnEditor)control).SubEditor.GetType().BaseType == typeof(FarPoint.Win.Spread.FpSpread))//System.Type.GetType("FarPoint.Win.Spread.FpSpread"))
{
if (((FpSpread)((MultiColumnEditor)control).SubEditor).ActiveSheet != null)
{
SheetView sv = ((FpSpread)((MultiColumnEditor)control).SubEditor).ActiveSheet;
for (int i = 0; widths.Length > i; i++)
{
if (widths > 0)
{
sv.Columns.Width = widths;
}
if (widths == 0)
{
sv.Columns.Visible=false;
}
if (widths < 0)
{
sv.Columns.Width = sv.GetPreferredColumnWidth(i, true, true, true);
}
}
}
}
}
}
实例化 一个新的MultiColumnEditor
mcbtype_SetColumnWidth mcbTable = new mcbtype_SetColumnWidth();
mcbTable.widths = new float[2]{ -1, 0 }; //设置列宽 (共2列 第一列 数值<0 意味着忽略手工定义 第二列=0 隐藏列Visible=false)
fptool.Sheets[0].Cells[0, 3].CellType = mcbTable;
总结:
两个办法都很蠢.
第一个办法超级手工,代码难看的要死.
第二个办法:目前只能兼容MultiColumnComboBoxCellType简单的绑定datatable,如果SubEditor里面再加入其他的控件或者做其他工作,还要接着完善.
MultiColumnEditor的SubEditor是个Container,里面装着另外一个FpSpread.
在MultiColumnEditor触发popup时候才能间接触发InitializeEditorControl,这时候FpSpread才会被创建,而且这个FpSpread没有直接引用FarPoint.Win.Spread 而是引用了FarPoint.Win.Spread内的一个内部对象
internal class a7 : FpSpread, ISubEditor, ISubEditorParentInfo (这个看着我直纳闷 后来ILSPY才去人木有眼花)
受够了Infragistics.Win.UltraWinGrid的对象模型 想用Spread替换,发现木有源代码的情况下想提升控件功能好麻烦,Spread还算厚道还有个SubEditor给用 不然也死球了.
今天啥也没干成被这个列宽给纠结了.
希望想用的人别像我一样满网搜索不到相关内容
其实我的问题应该是:
dtatable 有2列 绑定之后只想显示1列(mcbView.ColumnEdit = 0;//displaymember) 隐藏另一列(因为是guid 作为 mcbView.DataColumn = 0;//valuemember )
这个应该在绑定之前定义,绑定规则 有可见的 有不可见在
可惜只能找到 FarPoint.Win.Spread.Models.Data.ColumnCount 找不到FarPoint.Win.Spread.Models.Data.Columns 不然一切都简单了
大家共勉吧 |