上篇关于“在界面中动态修改列显示,列名列宽等”有缺陷,例如:GridView的DataSource是联合查询,就要手工修改XML文件,不支持XtraGrid列宽的拖拉,于是进一步改进。
思路如下:在GridControl第一次载入的时候,用XML文件记录GridView的列的信息。关闭窗体的时候,再次保存列的信息。列的隐藏,固定在弹出窗体中设定。
用到的一些方法入下:
//根据XML文件保存的信息设置GridView中的列
public static void SetGridView(DevExpress.XtraGrid.Views.Grid.GridView gridView, string xmlFile)
{
gridView.Columns.Clear();
DataSet ds = new DataSet();
ds.ReadXml(xmlFile);
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
DevExpress.XtraGrid.Columns.GridColumn gridCoulumn = new DevExpress.XtraGrid.Columns.GridColumn();
gridCoulumn.Caption = ds.Tables[0].Rows[i]["Caption"].ToString();
gridCoulumn.FieldName = ds.Tables[0].Rows[i]["FieldName"].ToString();
gridCoulumn.Name = ds.Tables[0].Rows[i]["ColumnName"].ToString();
gridCoulumn.VisibleIndex = int.Parse(ds.Tables[0].Rows[i]["VisibleIndex"].ToString());
gridCoulumn.Visible = ds.Tables[0].Rows[i]["Visible"].ToString().ToLower() == "true" ? true : false;
if (!gridCoulumn.Visible)
{
gridCoulumn.VisibleIndex = -1;
}
gridCoulumn.Width = int.Parse(ds.Tables[0].Rows[i]["Width"].ToString());
switch (ds.Tables[0].Rows[i]["Fixed"].ToString().ToLower())
{
case "none":
gridCoulumn.Fixed = DevExpress.XtraGrid.Columns.FixedStyle.None;
break;
case "left":
gridCoulumn.Fixed = DevExpress.XtraGrid.Columns.FixedStyle.Left;
break;
case "right":
gridCoulumn.Fixed = DevExpress.XtraGrid.Columns.FixedStyle.Right;
break;
}
if (ds.Tables[0].Rows[i]["ColumnEdit"].ToString() == "RepositoryItemLookUpEdit")
{
}
gridCoulumn.OptionsColumn.ReadOnly = true;
//gridCoulumn.BestFit();
gridView.Columns.Add(gridCoulumn);
}
}
public static void GridStyleShow(DevExpress.XtraGrid.Views.Grid.GridView gridView, string xmlFile)
{
gridView.Columns.Clear();
DataTable dt = new DataTable();
dt.TableName = "XMLStyle";
dt.Columns.AddRange(new DataColumn[] {
new DataColumn("FieldName", typeof(string)),
new DataColumn("Caption", typeof(string)),
new DataColumn("ColumnName", typeof(string)),
new DataColumn("Visible", typeof(bool)),
new DataColumn("VisibleIndex", typeof(int)),
new DataColumn("Width", typeof(int)),
new DataColumn("Fixed", typeof(string)),
new DataColumn("ReadOnly", typeof(bool))
});
dt.ReadXml(xmlFile);
for (int i = 0; i < dt.Rows.Count; i++)
{
DevExpress.XtraGrid.Columns.GridColumn gridCoulumn = new DevExpress.XtraGrid.Columns.GridColumn();
gridCoulumn.FieldName = dt.Rows[i]["FieldName"].ToString();
gridCoulumn.Caption = dt.Rows[i]["Caption"].ToString();
gridCoulumn.Name = dt.Rows[i]["ColumnName"].ToString();
gridCoulumn.Visible = (bool)dt.Rows[i]["Visible"];
gridCoulumn.VisibleIndex = (int)dt.Rows[i]["VisibleIndex"];
gridCoulumn.Width = (int)dt.Rows[i]["Width"];
switch (dt.Rows[i]["Fixed"].ToString().ToUpper())
{
case "LEFT":
gridCoulumn.Fixed = DevExpress.XtraGrid.Columns.FixedStyle.Left;
break;
case "RIGHT":
gridCoulumn.Fixed = DevExpress.XtraGrid.Columns.FixedStyle.Right;
break;
case "NONE":
gridCoulumn.Fixed = DevExpress.XtraGrid.Columns.FixedStyle.None;
break;
default:
break;
}
gridCoulumn.OptionsColumn.ReadOnly = (bool)dt.Rows[i]["ReadOnly"];
gridView.Columns.Add(gridCoulumn);
}
}
public static void GridStyleSave(DevExpress.XtraGrid.Views.Grid.GridView gridView, string xmlFile)
{
DataTable dt = GridStyleGet(gridView, xmlFile);
DataTableToXML(dt, xmlFile);
}
public static void DataTableToXML(DataTable dt, string xmlFile)
{
DataTable dtTemp = TableSort(dt, "VisibleIndex asc");
System.IO.FileStream fs = new System.IO.FileStream(xmlFile, System.IO.FileMode.Create);
System.Xml.XmlTextWriter xw = new System.Xml.XmlTextWriter(fs, System.Text.Encoding.Default);
xw.WriteStartDocument();
dtTemp.WriteXml(xw);
xw.Close();
fs.Close();
}
public static DataTable GridStyleGet(DevExpress.XtraGrid.Views.Grid.GridView gridView, string xmlFile)
{
DataTable dt = new DataTable();
dt.TableName = "XMLStyle";
dt.Columns.AddRange(new DataColumn[] {
new DataColumn("FieldName", typeof(string)),
new DataColumn("Caption", typeof(string)),
new DataColumn("ColumnName", typeof(string)),
new DataColumn("Visible", typeof(bool)),
new DataColumn("VisibleIndex", typeof(int)),
new DataColumn("Width", typeof(int)),
new DataColumn("Fixed", typeof(string)),
new DataColumn("ReadOnly", typeof(bool))
});
for (int i = 0; i < gridView.Columns.Count; i++)
{
DataRow dr = dt.NewRow();
dr["FieldName"] = gridView.Columns[i].FieldName;
dr["Caption"] = gridView.Columns[i].Caption;
dr["ColumnName"] = gridView.Columns[i].Name;
dr["Visible"] = gridView.Columns[i].Visible;
dr["VisibleIndex"] = gridView.Columns[i].VisibleIndex;
dr["Width"] = gridView.Columns[i].Width;
switch (gridView.Columns[i].Fixed)
{
case DevExpress.XtraGrid.Columns.FixedStyle.Left:
dr["Fixed"] = "Left";
break;
case DevExpress.XtraGrid.Columns.FixedStyle.Right:
dr["Fixed"] = "Right";
break;
case DevExpress.XtraGrid.Columns.FixedStyle.None:
dr["Fixed"] = "None";
break;
default:
dr["Fixed"] = "None";
break;
}
dr["ReadOnly"] = gridView.Columns[i].OptionsColumn.ReadOnly;
dt.Rows.Add(dr);
}
return dt;
}
public static DataTable GridFixedType()
{
DataTable dt = new DataTable();
dt.Columns.Add("FixShow", typeof(string));
dt.Columns.Add("FixName", typeof(string));
DataRow dr1 = dt.NewRow();
dr1[0] = "不固定";
dr1[1] = "None";
dt.Rows.Add(dr1);
DataRow dr2 = dt.NewRow();
dr2[0] = "左邊";
dr2[1] = "Left";
dt.Rows.Add(dr2);
DataRow dr3 = dt.NewRow();
dr3[0] = "右邊";
dr3[1] = "Right";
dt.Rows.Add(dr3);
return dt;
}
public static DataTable TableSort(DataTable dt,string sort)
{
DataRow[] resultRows= dt.Select(null, sort);
DataTable tableTemp = dt.Copy();
tableTemp.Rows.Clear();
foreach (DataRow dr in resultRows)
{
object[] objItem = dr.ItemArray;
DataRow row = tableTemp.NewRow();
row.ItemArray = objItem;
tableTemp.Rows.Add(row);
}
return tableTemp;
}
栏目设置窗体代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace ProcessPay
{
public partial class FrmColumnSetup : ProcessPay.FrmBase
{
public FrmColumnSetup()
{
InitializeComponent();
}
public delegate void RefreshEventHandler(string strFilter);
public event RefreshEventHandler RefreshData;
private DataTable dt;
private string xmlFile;
public DataTable DT
{
set { dt = value; }
get { return dt; }
}
public string XmlFile
{
set { xmlFile = value; }
get { return xmlFile; }
}
private void FrmColumnSetup_Load(object sender, EventArgs e)
{
repositoryItemLookUpEdit1.DataSource = Common.GridFixedType();
gridControl1.DataSource = dt;
}
private void gridView1_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
{
string fieldName = e.Column.FieldName;
int rowHandle = e.RowHandle;
if (fieldName == "Visible")
{
if ((bool)gridView1.GetRowCellValue(rowHandle, fieldName))
{
int maxIndex = 0;
for (int i = 0; i < gridView1.RowCount; i++)
{
if (int.Parse(gridView1.GetRowCellValue(i, "VisibleIndex").ToString()) > maxIndex)
{
maxIndex = int.Parse(gridView1.GetRowCellValue(i, "VisibleIndex").ToString());
}
}
gridView1.SetRowCellValue(rowHandle, "VisibleIndex", maxIndex + 1);
}
else
{
int visibleIndex = int.Parse(gridView1.GetRowCellValue(rowHandle, "VisibleIndex").ToString());
for (int i = 0; i < gridView1.RowCount; i++)
{
if (int.Parse(gridView1.GetRowCellValue(i, "VisibleIndex").ToString()) > visibleIndex)
{
int tempIndex = int.Parse(gridView1.GetRowCellValue(i, "VisibleIndex").ToString()) - 1;
gridView1.SetRowCellValue(i, "VisibleIndex", tempIndex);
}
}
gridView1.SetRowCellValue(rowHandle, "VisibleIndex", -1);
}
}
gridView1.CloseEditor();
}
private void SBSave_Click(object sender, EventArgs e)
{
Common.DataTableToXML(dt, xmlFile);
if (RefreshData != null)
{
RefreshData("");
}
this.Close();
}
}
}
主窗体代码:
private void FrmMain_Load(object sender, EventArgs e)
{
BindDataStyle("");
}
private void BindDataStyle(string strFilter)
{
bool isExist = System.IO.File.Exists(xmlFile);
if (isExist)
{
Common.GridStyleShow(gridView1, xmlFile);
}
BindData(strFilter);
if (!isExist)
{
Common.GridStyleSave(gridView1, xmlFile);
}
}
private void BindData(string strFilter)
{
DataSet ds = (new ProcessPay.BLL.SetNo()).GetList();
gridControl1.DataSource = ds.Tables[0];
}
private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
{
Common.GridStyleSave(gridView1, xmlFile);
}
//逆ヘ砞竚
private void barButtonItem11_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
FrmColumnSetup frm = new FrmColumnSetup();
DataTable dt = Common.GridStyleGet(gridView1, xmlFile);
frm.DT = dt;
frm.XmlFile = xmlFile;
frm.RefreshData += new FrmColumnSetup.RefreshEventHandler(BindDataStyle);
frm.ShowDialog();
}
分享到:
相关推荐
WinForm中使用XtraGrid控件,实现在界面中动态修改列显示,列名列宽等
WinForm下利用DevExpress控件实现的发票套打
Winform开发界面UI控件库开源共享,Winform开发界面UI控件库开源共享
Winform中的ComBox控件实现换行 当文本长度达到最大时实现换行
winform DataGridView控件 实现右击选中行,右击首列弹窗增删行
第一次玩这个,自己在学习过程中需要用到动态生成控件,参考了些资料,写了个生成label控件的方法,希望大家喜欢。
本例中,为WinForm提供方法,批量设置其界面上所有的控件为不可编辑状态 方法: SetReadOnly( Control.ControlCollection , List, Boolean>> , List) 说明: 当窗体内的控件存在[ReadOnly]属性时,只设置...
winform DataGridView 合计 行 控件 winform DataGridView 合计 行 控件
winform(c#)73种好看的窗体控件优化,界面样式,ssk文件。桌面程序美化。
一个LED自定义控件,可以直接在winform中使用,像使用默认控件一样,拖拽到Form窗体中就可以了,通过改变LED控件的属性,如颜色可以表示不同的执行状态或结果。
C# Winform 自定义 日程日历控件
今天在项目中需要选择时间的控件,但是winform中的dataTimePicker控件不能认为输入时间,或者就是要么只能选择时间,鄙人就包装了一下。可以选择日期,输入时间,带时分秒的。(vs2008包装的,如打不开,可以看看...
Winform调用WPF控件,演示WPF的DataGrid控件在Winform中如何调用刷新
C# Winform自定义电池控件 进度条
自己封装的继承自C# Winform中ComboBox的下拉多选控件,操作简单,效果非常好。①,可设置允许单选或多选。②,可绑定List,DataTable,Dictionary,string>类型的数据源。③,在下拉列表中可显示自定义的多列数据。...
C#winform使用的3D图表控件源代码,使用了SharpGL opentk文字显示效果不理想,因此这个是使用了SharpGL绘制的, 文字绘制是采用了文字缓存为图形的方式绘制的,整体效果还不错 这个版本应该是可以直接使用
主要介绍了WinForm中comboBox控件数据绑定实现方法,结合实例形式分析了WinForm实现comboBox控件数据绑定的常用方法与相关操作技巧,需要的朋友可以参考下
C# 中的第三方控件,很好用的,对winform开发做项目很有帮助
winform的自定义控件,可以在设计时选择资源窗口
c# winform 一个好用的打印控件,我的博客有代码