C1FlexGrid提供了可供用户调整列顺序的接口,在设置下面代码后:
1: this.c1FlexGrid1.AllowDragging = C1.Win.C1FlexGrid.AllowDraggingEnum.Columns;
可方便的在UI上拖拽列进行重新布局,非常方便,满足了不同用户的日常个性化设置。
但是有一个问题,如何能在下次程序启动后能“自动还原”现场?
答案是有的,这个就是序列化思想:
“序列化是指一个对象的实例可以被保存,保存成一个二进制串、文本串、XML、二进制加密数据等;把数据放在硬盘上。这样,关机时序列化它,开机时反序列化它。序列化概念的提出和实现,可以使我们的应用程序的设置信息保存和读取更加方便。序列化有很多好处,比如,在一台机器上产生一个实例,初始化完毕,然后可以序列化,通过网络传送到另一台机器,然后反序列化,得到对象实例,之后再执行某些业务逻辑,得到结果,再序列化,返回第一台机器,第一台机器得到对象实例,得到结果。这个例子是目前比较先进的“智能代理”的原理。 当前比较热火的web services使用soap协议,soap协议也是以对象的可序列化为基础的; 以及WCF通信原理也是通过序列化为XML、JSON字符串在网络中传送,在另外一台电脑再反序列化,还原对象。”
为了实现的更自动,响应了c1FlexGrid1_AfterDragColumn事件,每次当拖动列后,可触发该事件,我们进行序列化:保存为文本文件(您也可自行实现保存为二进制或者XML文件)。
1: /// <summary>2: /// Save Layout3: /// </summary>4: /// <param name="sender"></param>5: /// <param name="e"></param>6: private void c1FlexGrid1_AfterDragColumn(object sender, C1.Win.C1FlexGrid.DragRowColEventArgs e)7: {
8: StringBuilder sb = new StringBuilder();9: foreach (C1.Win.C1FlexGrid.Column item in this.c1FlexGrid1.Cols)10: {
11: sb.AppendLine(item.Name);
12: }
13:
14: File.WriteAllText(C1FlexGridLayout_file, sb.ToString());
15: }
当程序启动后,在Form_load方法中,可通过设置各个Column的Index进行恢复:
1: /// <summary>
2: /// Load Layout
3: /// </summary>
4: /// <param name="sender"></param>
5: /// <param name="e"></param>
6: private void Form1_Load(object sender, EventArgs e)
7: {
8: LoadFile();
9:
10: for (int i = 0; i < c1FlexGrid1.Cols.Count; i++)
11: {
12: C1.Win.C1FlexGrid.Column item = c1FlexGrid1.Cols[i];
13: int newOne = GetNewPostion(item.Name);
14: if (newOne == -1 || newOne == item.Index)
15: {
16: continue;
17: }
18:
19: item.Move(newOne);
20: }
21: }
源码下载: