天天看點

Telerik 控件事例(滑鼠拖動行,拖動列,設定行對齊,行寬,是否顯示)

Telerik 控件事例(滑鼠拖動行,拖動列,設定行對齊,行寬,是否顯示)
Telerik 控件事例(滑鼠拖動行,拖動列,設定行對齊,行寬,是否顯示)

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;

上一篇: 5.6. openssl
下一篇: C# 讀XML檔案

繼續閱讀