您的位置:首页 > 其它

DevExpress XtraGridControl 拖拽调整行顺序

2016-02-10 11:50 423 查看
using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using DevExpress.XtraGrid;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid.Views.Grid.ViewInfo;

namespace SwapRows
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private DevExpress.XtraGrid.GridControl gridControl1;
private DevExpress.XtraGrid.Views.Grid.GridView gridView1;
private System.Data.DataSet dataSet1;
private System.Data.DataTable dataTable1;
private System.Data.DataColumn dataColumn1;
private System.Data.DataColumn dataColumn2;
private System.Data.DataColumn dataColumn3;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;

public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();

//
// TODO: Add any constructor code after InitializeComponent call
//
}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose(bool disposing)
{
if ( disposing )
{
if ( components != null )
{
components.Dispose();
}
}
base.Dispose(disposing);
}

#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.gridControl1 = new DevExpress.XtraGrid.GridControl();
this.gridView1 = new DevExpress.XtraGrid.Views.Grid.GridView();
this.dataSet1 = new System.Data.DataSet();
this.dataTable1 = new System.Data.DataTable();
this.dataColumn1 = new System.Data.DataColumn();
this.dataColumn2 = new System.Data.DataColumn();
this.dataColumn3 = new System.Data.DataColumn();
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.gridControl1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.gridView1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.dataSet1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.dataTable1)).BeginInit();
this.SuspendLayout();
//
// gridControl1
//
this.gridControl1.AllowDrop = true;
this.gridControl1.Dock = System.Windows.Forms.DockStyle.Left;
this.gridControl1.Location = new System.Drawing.Point(0, 0);
this.gridControl1.MainView = this.gridView1;
this.gridControl1.Name = "gridControl1";
this.gridControl1.Size = new System.Drawing.Size(419, 310);
this.gridControl1.TabIndex = 0;
this.gridControl1.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] {
this.gridView1});
this.gridControl1.DragOver += new System.Windows.Forms.DragEventHandler(this.gridControl1_DragOver);
this.gridControl1.DragDrop += new System.Windows.Forms.DragEventHandler(this.gridControl1_DragDrop);
//
// gridView1
//
this.gridView1.GridControl = this.gridControl1;
this.gridView1.Name = "gridView1";
this.gridView1.OptionsBehavior.Editable = false;
this.gridView1.OptionsView.NewItemRowPosition = DevExpress.XtraGrid.Views.Grid.NewItemRowPosition.Bottom;
this.gridView1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.gridView1_MouseMove);
this.gridView1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.gridView1_MouseDown);
//
// dataSet1
//
this.dataSet1.DataSetName = "NewDataSet";
this.dataSet1.Locale = new System.Globalization.CultureInfo("en-US");
this.dataSet1.Tables.AddRange(new System.Data.DataTable[] {
this.dataTable1});
//
// dataTable1
//
this.dataTable1.Columns.AddRange(new System.Data.DataColumn[] {
this.dataColumn1,
this.dataColumn2,
this.dataColumn3});
this.dataTable1.TableName = "Table1";
//
// dataColumn1
//
this.dataColumn1.ColumnName = "ID";
this.dataColumn1.DataType = typeof(int);
//
// dataColumn2
//
this.dataColumn2.ColumnName = "Keyword";
//
// dataColumn3
//
this.dataColumn3.ColumnName = "Order";
this.dataColumn3.DataType = typeof(decimal);
//
// button1
//
this.button1.Location = new System.Drawing.Point(425, 12);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(62, 20);
this.button1.TabIndex = 1;
this.button1.Text = "&Up";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// button2
//
this.button2.Location = new System.Drawing.Point(425, 46);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(62, 20);
this.button2.TabIndex = 2;
this.button2.Text = "&Down";
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(499, 310);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Controls.Add(this.gridControl1);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
((System.ComponentModel.ISupportInitialize)(this.gridControl1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.gridView1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.dataSet1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.dataTable1)).EndInit();
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

void FillDataSet()
{
dataTable1.Rows.Add(new object[] { 1, "abstract", 1 });
dataTable1.Rows.Add(new object[] { 2, "event", 2 });
dataTable1.Rows.Add(new object[] { 3, "new", 3 });
dataTable1.Rows.Add(new object[] { 4, "struct", 4 });
dataTable1.Rows.Add(new object[] { 5, "as", 5 });
dataTable1.Rows.Add(new object[] { 6, "explicit", 6 });
dataTable1.Rows.Add(new object[] { 7, "null", 7 });
dataTable1.Rows.Add(new object[] { 8, "switch", 8 });
dataTable1.Rows.Add(new object[] { 9, "base", 9 });
dataTable1.Rows.Add(new object[] { 10, "extern", 10 });
dataTable1.Rows.Add(new object[] { 11, "object", 11 });
dataTable1.Rows.Add(new object[] { 12, "this", 12 });
dataTable1.Rows.Add(new object[] { 13, "bool", 13 });
dataTable1.Rows.Add(new object[] { 14, "false", 14 });
dataTable1.Rows.Add(new object[] { 15, "operator", 15 });
dataTable1.Rows.Add(new object[] { 16, "throw", 16 });
dataTable1.Rows.Add(new object[] { 17, "break", 17 });
dataTable1.AcceptChanges();
}

private void Form1_Load(object sender, System.EventArgs e)
{
FillDataSet();
gridControl1.DataSource = dataTable1;
gridView1.PopulateColumns();
gridView1.Columns[OrderFieldName].SortOrder = DevExpress.Data.ColumnSortOrder.Ascending;
gridView1.OptionsCustomization.AllowSort = false;
gridView1.OptionsView.ShowGroupPanel = false;
}

const string OrderFieldName = "Order";

private void button1_Click(object sender, System.EventArgs e)
{
GridView view = gridView1;
view.GridControl.Focus();
int index = view.FocusedRowHandle;
if ( index <= 0 )
return;

DataRow row1 = view.GetDataRow(index);
DataRow row2 = view.GetDataRow(index - 1);
object val1 = row1[OrderFieldName];
object val2 = row2[OrderFieldName];
row1[OrderFieldName] = val2;
row2[OrderFieldName] = val1;

view.FocusedRowHandle = index - 1;
}

private void button2_Click(object sender, System.EventArgs e)
{
GridView view = gridView1;
view.GridControl.Focus();
int index = view.FocusedRowHandle;
if ( index >= view.DataRowCount - 1 )
return;

DataRow row1 = view.GetDataRow(index);
DataRow row2 = view.GetDataRow(index + 1);
object val1 = row1[OrderFieldName];
object val2 = row2[OrderFieldName];
row1[OrderFieldName] = val2;
row2[OrderFieldName] = val1;

view.FocusedRowHandle = index + 1;
}

GridHitInfo downHitInfo = null;

private void gridView1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
GridView view = sender as GridView;
downHitInfo = null;

GridHitInfo hitInfo = view.CalcHitInfo(new Point(e.X, e.Y));
if ( Control.ModifierKeys != Keys.None )
return;
if ( e.Button == MouseButtons.Left && hitInfo.InRow && hitInfo.RowHandle != GridControl.NewItemRowHandle )
downHitInfo = hitInfo;
}

private void gridView1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
GridView view = sender as GridView;
if ( e.Button == MouseButtons.Left && downHitInfo != null )
{
Size dragSize = SystemInformation.DragSize;
Rectangle dragRect = new Rectangle(new Point(downHitInfo.HitPoint.X - dragSize.Width / 2,
downHitInfo.HitPoint.Y - dragSize.Height / 2), dragSize);

if ( !dragRect.Contains(new Point(e.X, e.Y)) )
{
view.GridControl.DoDragDrop(downHitInfo, DragDropEffects.All);
downHitInfo = null;
}
}
}

private void gridControl1_DragOver(object sender, DragEventArgs e)
{
if ( e.Data.GetDataPresent(typeof(GridHitInfo)) )
{
GridHitInfo downHitInfo = e.Data.GetData(typeof(GridHitInfo)) as GridHitInfo;
if ( downHitInfo == null )
return;

GridControl grid = sender as GridControl;
GridView view = grid.MainView as GridView;
GridHitInfo hitInfo = view.CalcHitInfo(grid.PointToClient(new Point(e.X, e.Y)));
if ( hitInfo.InRow && hitInfo.RowHandle != downHitInfo.RowHandle && hitInfo.RowHandle != GridControl.NewItemRowHandle )
e.Effect = DragDropEffects.Move;
else
e.Effect = DragDropEffects.None;
}
}

private void gridControl1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
GridControl grid = sender as GridControl;
GridView view = grid.MainView as GridView;
GridHitInfo srcHitInfo = e.Data.GetData(typeof(GridHitInfo)) as GridHitInfo;
GridHitInfo hitInfo = view.CalcHitInfo(grid.PointToClient(new Point(e.X, e.Y)));
int sourceRow = srcHitInfo.RowHandle;
int targetRow = hitInfo.RowHandle;
MoveRow(sourceRow, targetRow);
}

private void MoveRow(int sourceRow, int targetRow)
{
if ( sourceRow == targetRow || sourceRow == targetRow + 1 )
return;

GridView view = gridView1;
DataRow row1 = view.GetDataRow(targetRow);
DataRow row2 = view.GetDataRow(targetRow + 1);
DataRow dragRow = view.GetDataRow(sourceRow);
decimal val1 = (decimal)row1[OrderFieldName];
if ( row2 == null )
dragRow[OrderFieldName] = val1 + 1;
else
{
decimal val2 = (decimal)row2[OrderFieldName];
dragRow[OrderFieldName] = (val1 + val2) / 2;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: