找回密码
 立即注册

QQ登录

只需一步,快速开始

ruo2012

新手上路

1

主题

4

帖子

39

积分

新手上路

积分
39
  • 35

    金币

  • 主题

  • 帖子

最新发帖
ruo2012
新手上路   /  发表于:2012-9-20 12:26  /   查看:7682  /  回复:2
datatable中有2列"TABLE_NAME" "TABLE_GUID" 其中TABLE_GUID(数据类型为GUID)不想显示只作为value通过DataColumn保存 .
因而mcb需要绑定2列 但是只显示列"TABLE_NAME"  需要隐藏"TABLE_GUID"


MultiColumnComboBoxCellType mcb = new MultiColumnComboBoxCellType();
            DataView dvView = new DataView(dtTables, "TABLE_GUID='VIEW'", "TABLE_NAME", DataViewRowState.CurrentRows);
            DataTable dtView = dvView.ToTable("Schema_VIEW", false, "TABLE_NAME", "TABLE_GUID");
            dtView.Columns[0].ColumnName = "VIEW_NAME";
            fpschema.Sheets[2].DataSource = dvView;
            fpschema.Sheets[2].SheetName = "VIEW";
            fpschema.Sheets[2].ColumnHeader.Rows[0].Height = 45;
            mcb.ListResizeColumns = FarPoint.Win.Spread.CellType.ListResizeColumns.FitWidestItem;
            mcb.DataSourceList = dtView;
            mcb.DataColumn = 1;//valuemember
            mcb.ColumnEdit = 2;//displaymember

2 个回复

倒序浏览
ruo2012
新手上路   /  发表于:2012-9-20 15:32:00
沙发
自己找出来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 不然一切都简单了

大家共勉吧
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-9-20 16:07:00
板凳
回复 2楼ruo2012的帖子

ruo2012 你好

首先非常感谢你共享以上解决方案,我会将这个帖子移动到产品的【知识库与精华区】中,共更多的用户参考使用。

MultiColumnComboBoxCellType 的确没有暴露所显示Grid的属性,MultiColumnComboBoxCellType  所显示的Grid也是一个FpSpread控件,所以我们可以在拿到FpSpread之后设置我们需要的属性。

除了以上两种方法外,还可以在 EditmodeOn 事件中进行设置:
  1.     private void fpSpread1_EditModeOn(object sender, EventArgs e)
  2.     {
  3.         MultiColumnEditor mce = fpSpread1.EditingControl as MultiColumnEditor;

  4.         if (mce != null)
  5.         {
  6.             FpSpread c = mce.SubEditor as FpSpread;
  7.             c.Sheets[0].Columns[0].Visible = false;
  8.         }
  9.     }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部