
People.cs
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
namespace RadGridViewControl
{
public class People
{
public Guid Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Sex { get; set; }
public string Tel { get; set; }
public string Address { get; set; }
public DateTime BirthDay { get; set; }
public string Note { get; set; }
public string Like { get; set; }
public string Work { get; set; }
public List<People> Init()
{
var list = new List<People>();
for (int i = 0; i < 20; i++)
{
var people = new People
{
Id = Guid.NewGuid(),
FirstName = "王",
LastName = "友",
Sex = "男",
Tel = "15209893158",
Address = "安徽省合肥市高新區",
BirthDay = DateTime.Now,
Note = "大家好我是王友",
Like = "我喜歡程式設計",
Work = "其實我是一名程式員"
};
list.Add(people);
}
return list;
}
public DataTable Data()
DataTable dt = new DataTable();
dt.Columns.Add("Id");
dt.Columns.Add("FirstName");
dt.Columns.Add("LastName");
dt.Columns.Add("Sex");
dt.Columns.Add("Tel");
dt.Columns.Add("Address");
dt.Columns.Add("BirthDay");
dt.Columns.Add("Note");
dt.Columns.Add("Like");
dt.Columns.Add("Work");
for (int i = 0; i < 20; i++)
DataRow dr = dt.NewRow();
dr["Id"] = i;
dr["FirstName"] = "王";
dr["LastName"] = "友"+i;
dr["Sex"] = "男";
dr["Tel"] = "1520989315"+i;
dr["Address"] = "安徽省合肥市高新區";
dr["BirthDay"] = DateTime.Now.AddDays(i);
dr["Note"] = "大家好我是王友"+i;
dr["Like"] = "我喜歡程式設計";
dr["Work"] = "其實我是一名程式員";
dt.Rows.Add(dr);
}
return dt;
}
RadGridViewUserControl.cs
using System.Drawing;
using System.Windows.Forms;
using Telerik.WinControls;
using Telerik.WinControls.Data;
using Telerik.WinControls.UI;
using Telerik.WinControls.UI.Localization;
using System.Xml;
public partial class RadGridViewUserControl : UserControl
/// <summary>
/// 資料源
/// </summary>
public DataTable Data;
private DataTable DataTableList { get; set; }
/// 構造函數
public RadGridViewUserControl()
InitializeComponent();
/// 構造函數2
/// <param name="xmlName">xml檔案路徑+名稱</param>
public RadGridViewUserControl(string xmlName)
_xmlName = xmlName;
#region 定義的接口
/// 定義xml檔案
public string Xml { get; set; }
/// xml檔案路徑+名稱
public List<SelectColumn> ReadXml()
List<SelectColumn> selectColumns = new List<SelectColumn>();
XmlDataDocument doc = new XmlDataDocument();
try
doc.Load(Xml);
XmlNode dataTableSettingsNode = doc.SelectSingleNode("DataTable_Settings");//根結點
XmlNode dataCellsNode = dataTableSettingsNode.SelectSingleNode("data_cells");
if (null == dataCellsNode) return null;
XmlNodeList dataCellNode = dataCellsNode.SelectNodes("data_cell");
foreach (XmlNode node in dataCellNode)
SelectColumn selectColumn = new SelectColumn();
selectColumn.ColumnName = node.SelectSingleNode("cell_name").InnerText;
selectColumn.ChineseColumnName = node.SelectSingleNode("chinese_name").InnerText;
selectColumn.IsVisible = bool.Parse(node.SelectSingleNode("visible").InnerText);
selectColumn.Width = int.Parse(node.SelectSingleNode("width").InnerText);
selectColumn.Align = int.Parse(node.SelectSingleNode("align").InnerText);
selectColumn.ShowIndex = int.Parse(node.SelectSingleNode("show_index").InnerText);
selectColumns.Add(selectColumn);
}
catch (Exception ex)
return selectColumns;
/// <summary>
/// 擷取選中的資料
/// </summary>
/// <param name="indexList">擷取選中的行</param>
/// <returns></returns>
public List<GridViewRowInfo> GetSelData(ref List<string> indexList)
var listRows = new List<GridViewRowInfo>();
foreach (var row in rgv_Control.Rows)
var value = row.Cells["ChkSelect"].Value.ToString();
var index = row.Cells["Num"].Value.ToString();
if (!value.Equals("True")) continue;
indexList.Add(index);
listRows.Add(row);
return listRows;
/// 初始化使用者控件
public void RadGridViewControl_Init(DataTable dataTable)
DataTableList = dataTable;
SetRadGridViewProperty();
AddTwoColumn();
BindRadGridViewControl(dataTable);
WrapText();
SetColumnReadOnly();
RadGridLocalizationProvider.CurrentProvider = new ChineseRadGridLocalizationProvider();
rgv_Control.Rows.CollectionChanged += Rows_CollectionChanged;
SetRadGridViewForXml();
/// 通過XML設定RadGridView控件
private void SetRadGridViewForXml()
var list = ReadXml();
SetColumnWidth(list);
ConvertColumnNameToChinese(list);
ShowColumnName(list);
SetColumnAlign(list);
ShowColumnIndex(list);
/// 擷取拖動後的資料記錄
public DataTable GetAllGridViewData()
var dt = new DataTable();
foreach (var column in rgv_Control.Columns)
var dataColumn = new DataColumn
ColumnName = column.Name
};
if (!(column.Name.Equals("Num") || column.Name.Equals("ChkSelect")))
dt.Columns.Add(dataColumn);
foreach (GridViewRowInfo t in rgv_Control.Rows)
var datarow = dt.NewRow();
for (var j = 0; j < dt.Columns.Count; j++)
datarow[dt.Columns[j].ColumnName] = t.Cells[dt.Columns[j].ColumnName].Value;
dt.Rows.Add(datarow);
/// 擷取按鈕的句柄
public IntPtr getBtHandler()
return this.btn_Select.Handle;
#endregion
/// 如果像這樣寫分組的話那我要累死
public bool EnableGrouping
get { return rgv_Control.EnableGrouping; }
set { rgv_Control.EnableGrouping = value; }
/// 設定RadGridView控件屬性
private void SetRadGridViewProperty()
rgv_Control.EnableGrouping = false;//去掉分組
rgv_Control.AllowDrop = true;
rgv_Control.AllowRowReorder = true;
rgv_Control.AddNewRowPosition = SystemRowPosition.Bottom;
rgv_Control.ShowRowHeaderColumn = false;
rgv_Control.AutoSizeRows = true;
rgv_Control.AllowAddNewRow = false;
/// 添加兩個特殊列
private void AddTwoColumn()
var numColumn = new GridViewDecimalColumn(typeof(int), "Num", "Num")
HeaderText = "序 号",
Width = 50,
ReadOnly = true,
IsPinned = true
};
rgv_Control.Columns.Add(numColumn);
var chkColumn = new GridViewCheckBoxColumn("ChkSelect", "ChkSelect")
HeaderText = "選 擇",
rgv_Control.Columns.Add(chkColumn);
/// 設定表格隻讀
private void SetColumnReadOnly()
for (var i = 0; i < rgv_Control.Columns.Count; i++)
rgv_Control.Columns[i].ReadOnly = true;
rgv_Control.Columns["ChkSelect"].ReadOnly = false;
/// 顯示列順序
/// <param name="list"></param>
private void ShowColumnIndex(IEnumerable<SelectColumn> list)
foreach (var i in list)
SelectColumn selectColumn = i;
foreach (var column in rgv_Control.Columns.Where(column => !column.Name.Equals("Num") && !column.Name.Equals("ChkSelect")).Where(column => selectColumn.ColumnName.Equals(column.Name)))
var oldIndex = column.Index;
var newIndex = i.ShowIndex;
if (oldIndex > newIndex)
rgv_Control.Columns.Move(oldIndex, newIndex);
rgv_Control.Columns.Move(newIndex + 1, oldIndex);
else if (oldIndex < newIndex)
rgv_Control.Columns.Move(newIndex - 1, oldIndex);
break;
/// 設定列寬度
private void SetColumnWidth(IEnumerable<SelectColumn> list)
rgv_Control.Columns[i.ColumnName].Width = i.Width;
/// 将列名轉化成中文
public void ConvertColumnNameToChinese(List<SelectColumn> list)
rgv_Control.Columns[i.ColumnName].HeaderText = i.ChineseColumnName;
/// Data中,是否顯示列名稱
public void ShowColumnName(List<SelectColumn> list)
rgv_Control.Columns[i.ColumnName].IsVisible = i.IsVisible;
/// 設定列對齊
public void SetColumnAlign(List<SelectColumn> list)
switch (i.Align)
case 0:
rgv_Control.Columns[i.ColumnName].TextAlignment = ContentAlignment.MiddleCenter;
case 1:
rgv_Control.Columns[i.ColumnName].TextAlignment = ContentAlignment.MiddleLeft;
case 3:
rgv_Control.Columns[i.ColumnName].TextAlignment = ContentAlignment.MiddleRight;
default:
/// 點選列選擇按鈕
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_Select_Click(object sender, EventArgs e)
var selectColumnForm = new SelectColumnForm(Xml);
selectColumnForm.ShowDialog();
if (selectColumnForm.DialogResult == DialogResult.OK)
SetRadGridViewForXml();
/// 設定右鍵菜單
private void rgv_Control_ContextMenuOpening(object sender, Telerik.WinControls.UI.ContextMenuOpeningEventArgs e)
for (var i = 0; i < e.ContextMenu.Items.Count; i++)
var contextMenuText = e.ContextMenu.Items[i].Text;
switch (contextMenuText)
case "條件格式":
e.ContextMenu.Items[i].Visibility = ElementVisibility.Collapsed;
e.ContextMenu.Items[i + 1].Visibility = ElementVisibility.Collapsed;
case "隐 藏":
case "鎖定狀态":
case "自适應列寬":
case "列選擇":
/// 設定換行
public void WrapText()
foreach (var obj in rgv_Control.Columns)
obj.WrapText = true;
/// RadGridView控件綁定資料
/// <param name="dt"></param>
public void BindRadGridViewControl(DataTable dt)
var num = 0;
foreach (var newColumn in from object column in dt.Columns select new GridViewTextBoxColumn(column.ToString(), column.ToString()))
rgv_Control.Columns.Add(newColumn);
for (var i = 0; i < dt.Rows.Count; i++)
var cellcount = 0;
var listRow = new object[dt.Rows.Count + 2];
listRow[cellcount++] = ++num;
listRow[cellcount++] = false;
listRow[cellcount++] = dt.Rows[i][j];
rgv_Control.Rows.Add(listRow);
///
private void Rows_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
if (e.Action != NotifyCollectionChangedAction.Move) return;
for (var i = 0; i < rgv_Control.Rows.Count; i++)
rgv_Control.Rows[i].Cells["Num"].Value = i + 1;
/// 測試資料1
private void btn_Data_Click(object sender, EventArgs e)
var rowIndexList = new List<string>();
var rows = GetSelData(ref rowIndexList);//測試GetSelData方法
/// 測試資料2
private void btn_GetAllData_Click(object sender, EventArgs e)
var dt = GetAllGridViewData();//測試GetAllGridViewData方法
SelectColumnForm.cs
public partial class SelectColumnForm : Form
/// 定義xml檔案
public string Xml { get; set; }
public SelectColumnForm()
InitializeComponent();
public SelectColumnForm(string xml)
Xml = xml;
AddColumns();
AddRows(list);
rgv_SelectColumn.Rows.CollectionChanged += Rows_CollectionChanged;
foreach (var column in rgv_SelectColumn.Columns)
dt.Columns.Add(dataColumn);
foreach (GridViewRowInfo t in rgv_SelectColumn.Rows)
/// 修改xml檔案
private void ModifyXml(DataTable dt)
XmlDataDocument doc = new XmlDataDocument();
try
doc.Load(Xml);
XmlNode dataTableSettingsNode = doc.SelectSingleNode("DataTable_Settings");//根結點
XmlNode dataCellsNode = dataTableSettingsNode.SelectSingleNode("data_cells");
if (null == dataCellsNode) return;
XmlNodeList dataCellNode = dataCellsNode.SelectNodes("data_cell");
foreach (XmlNode node in dataCellNode)
var chinesename = node.SelectSingleNode("chinese_name").InnerText;
var row = SearchRows(chinesename, dt);
node.SelectSingleNode("show_index").InnerText = (int.Parse(row[0].ToString()) + 1).ToString();
node.SelectSingleNode("visible").InnerText = row[1].ToString();
node.SelectSingleNode("width").InnerText = row[3].ToString();
switch (row[4].ToString())
case "左對齊":
node.SelectSingleNode("align").InnerText = "1";
break;
case "右對齊":
node.SelectSingleNode("align").InnerText = "2";
case "居中對齊":
node.SelectSingleNode("align").InnerText = "0";
default: break;
}
doc.Save(Xml);
private object[] SearchRows(string rowname, DataTable dt)
foreach (DataRow row in dt.Rows)
if (row["colname"].ToString() == rowname)
return row.ItemArray;
return null;
/// 添加資料行
private void AddRows(List<SelectColumn> list)
var count = 0;
var linqList = (from column in list
orderby column.ShowIndex
select column).ToList();
foreach (var selectColumn in linqList)
var obj = new object[list.Count];
obj[0] = ++count;
obj[1] = selectColumn.IsVisible;
obj[2] = selectColumn.ChineseColumnName;
obj[3] = selectColumn.Width;
switch (selectColumn.Align)
obj[4] = "居中對齊";
obj[4] = "左對齊";
case 2:
obj[4] = "右對齊";
rgv_SelectColumn.Rows.Add(obj);
private void btn_Ok_Click(object sender, EventArgs e)
var dt = GetAllGridViewData();
ModifyXml(dt);
DialogResult=DialogResult.OK;
Close();
/// 添加資料列
private void AddColumns()
var num = new GridViewTextBoxColumn("Num", "Num");
num.HeaderText = "序 号";
num.ReadOnly = true;
num.Width = 50;
num.WrapText = false;
num.TextAlignment = ContentAlignment.MiddleCenter;
var chk = new GridViewCheckBoxColumn("Chk", "Chk");
chk.HeaderText = "選 擇";
chk.ReadOnly = false;
chk.Width = 50;
chk.WrapText = false;
var colname = new GridViewTextBoxColumn("colname", "colname");
colname.HeaderText = "列 名";
colname.ReadOnly = true;
colname.Width = 100;
colname.WrapText = false;
colname.TextAlignment = ContentAlignment.MiddleCenter;
var colwidth = new GridViewDecimalColumn("colwidth", "colwidth");
colwidth.HeaderText = "列 寬";
colwidth.ReadOnly = false;
colwidth.DataType = typeof(int);
colwidth.Width = 80; ;
colwidth.WrapText = false;
colwidth.TextAlignment = ContentAlignment.MiddleCenter;
colwidth.FormatString = "{0:d}";
var colalign = new GridViewComboBoxColumn("colalign", "colalign");
colalign.HeaderText = "對齊方式";
colalign.DataSource = new[] { "左對齊", "居中對齊", "右對齊" };
colalign.Width = 100;
colalign.WrapText = false;
colalign.TextAlignment = ContentAlignment.MiddleCenter;
rgv_SelectColumn.Columns.Add(num);
rgv_SelectColumn.Columns.Add(chk);
rgv_SelectColumn.Columns.Add(colname);
rgv_SelectColumn.Columns.Add(colwidth);
rgv_SelectColumn.Columns.Add(colalign);
rgv_SelectColumn.EnableGrouping = false;//去掉分組
rgv_SelectColumn.AllowDrop = true;
rgv_SelectColumn.AllowRowReorder = true;
rgv_SelectColumn.AddNewRowPosition = SystemRowPosition.Bottom;
rgv_SelectColumn.ShowRowHeaderColumn = false;
rgv_SelectColumn.AllowColumnHeaderContextMenu = false;
rgv_SelectColumn.AllowColumnResize = false;
rgv_SelectColumn.AllowColumnReorder = false;
rgv_SelectColumn.EnableSorting = false;
rgv_SelectColumn.AllowAddNewRow = false;
rgv_SelectColumn.AllowRowResize = false;
/// xml檔案路徑+名稱
public List<SelectColumn> ReadXml()
List<SelectColumn> selectColumns = new List<SelectColumn>();
if (null == dataCellsNode) return null;
SelectColumn selectColumn = new SelectColumn();
selectColumn.ColumnName = node.SelectSingleNode("cell_name").InnerText;
selectColumn.ChineseColumnName = node.SelectSingleNode("chinese_name").InnerText;
selectColumn.IsVisible = bool.Parse(node.SelectSingleNode("visible").InnerText);
selectColumn.Width = int.Parse(node.SelectSingleNode("width").InnerText);
selectColumn.Align = int.Parse(node.SelectSingleNode("align").InnerText);
selectColumn.ShowIndex = int.Parse(node.SelectSingleNode("show_index").InnerText);
selectColumns.Add(selectColumn);
/// 行拖動時控件序号的顯示
for (var i = 0; i < rgv_SelectColumn.Rows.Count; i++)
rgv_SelectColumn.Rows[i].Cells["Num"].Value = i + 1;