drag and drop from a DataGrid

  • Thread starter Ajay Krishnan Thampi
  • Start date
A

Ajay Krishnan Thampi

I have a slight problem implementing 'drag and drop' from a datagrid
to a tree-view. I have pasted my code below. Someone please advice me
on what to do...pretty blur right now.

==code==

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;

namespace DragDropTry
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.DataGrid grdSearch;
private System.Windows.Forms.TreeView tvMain;
/// <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.grdSearch = new System.Windows.Forms.DataGrid();
this.tvMain = new System.Windows.Forms.TreeView();
((System.ComponentModel.ISupportInitialize)(this.grdSearch)).BeginInit();
this.SuspendLayout();
//
// grdSearch
//
this.grdSearch.DataMember = "";
this.grdSearch.HeaderForeColor =
System.Drawing.SystemColors.ControlText;
this.grdSearch.Location = new System.Drawing.Point(216, 72);
this.grdSearch.Name = "grdSearch";
this.grdSearch.Size = new System.Drawing.Size(336, 216);
this.grdSearch.TabIndex = 0;
this.grdSearch.MouseUp += new
System.Windows.Forms.MouseEventHandler(this.grdSearch_MouseUp_1);
this.grdSearch.DragOver += new
System.Windows.Forms.DragEventHandler(this.grdSearch_DragOver);
this.grdSearch.DragEnter += new
System.Windows.Forms.DragEventHandler(this.grdSearch_DragEnter);
//
// tvMain
//
this.tvMain.ImageIndex = -1;
this.tvMain.Location = new System.Drawing.Point(16, 72);
this.tvMain.Name = "tvMain";
this.tvMain.SelectedImageIndex = -1;
this.tvMain.Size = new System.Drawing.Size(176, 168);
this.tvMain.TabIndex = 1;
this.tvMain.DragEnter += new
System.Windows.Forms.DragEventHandler(this.tvMain_DragEnter);
this.tvMain.ItemDrag += new
System.Windows.Forms.ItemDragEventHandler(this.tvMain_ItemDrag);
this.tvMain.DragDrop += new
System.Windows.Forms.DragEventHandler(this.tvMain_DragDrop);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(576, 454);
this.Controls.Add(this.tvMain);
this.Controls.Add(this.grdSearch);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.MouseUp += new
System.Windows.Forms.MouseEventHandler(this.grdSearch_MouseUp_1);
this.DragOver += new
System.Windows.Forms.DragEventHandler(this.grdSearch_DragOver);
this.DragDrop += new
System.Windows.Forms.DragEventHandler(this.tvMain_DragDrop);
this.DragEnter += new
System.Windows.Forms.DragEventHandler(this.tvMain_DragEnter);
((System.ComponentModel.ISupportInitialize)(this.grdSearch)).EndInit();
this.ResumeLayout(false);

}
#endregion

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


private void Form1_Load(object sender, System.EventArgs e)
{
DataSet ds = new DataSet();
ds.ReadXml("searchResult.xml");

DataView dv = new DataView();
dv = ds.Tables[0].DefaultView;

grdSearch.DataSource = dv;
grdSearch.TableStyles.Clear();

DataGridTableStyle ts1 = new DataGridTableStyle();
ts1.MappingName = dv.Table.TableName;

System.Windows.Forms.DataGridBoolColumn col1 = new
DataGridBoolColumn();
col1.MappingName = "text";
col1.HeaderText = "";
col1.Width = 30;
col1.AllowNull = false;
col1.FalseValue = "False";
col1.TrueValue = "True";

System.Windows.Forms.DataGridTextBoxColumn col2 = new
DataGridTextBoxColumn();
col2.MappingName = "rec";
col2.HeaderText = "Rec";
col2.Width = 30;

System.Windows.Forms.DataGridTextBoxColumn col3 = new
DataGridTextBoxColumn();
col3.MappingName = "title";
col3.HeaderText = "title";
col3.Width = 220;

ts1.GridColumnStyles.Add(col1);
ts1.GridColumnStyles.Add(col2);
ts1.GridColumnStyles.Add(col3);

grdSearch.TableStyles.Add(ts1);

tvMain.BeginUpdate();
tvMain.Nodes.Add(new TreeNode("AA"));
TreeNode tnn = new TreeNode("Query_" +
System.DateTime.Now.ToString("MMM-dd-yyyy") + "_" +
System.DateTime.Now.ToShortTimeString() + " " + "aaa");
tvMain.Nodes[0].Nodes.Add(tnn);
tvMain.Nodes[0].Expand();
tvMain.EndUpdate();

//grdSearch.MouseUp += new
MouseEventHandler(grdSearch_MouseUp(sender,e));
this.grdSearch.MouseUp += new
System.Windows.Forms.MouseEventHandler(this.grdSearch_MouseUp_1);
this.grdSearch.DragEnter += new
System.Windows.Forms.DragEventHandler(this.grdSearch_DragEnter);
this.grdSearch.DragOver += new
System.Windows.Forms.DragEventHandler(this.grdSearch_DragOver);
this.tvMain.DragDrop += new
System.Windows.Forms.DragEventHandler(this.tvMain_DragDrop);
this.tvMain.DragEnter += new
System.Windows.Forms.DragEventHandler(this.tvMain_DragEnter);
this.tvMain.ItemDrag += new
System.Windows.Forms.ItemDragEventHandler(this.tvMain_ItemDrag);

//tvMain.Nodes[0].Nodes.Add(new TreeNode("Query_" +
System.DateTime.Now.ToShortDateString() + "@" +
System.DateTime.Now.ToShortTimeString() + "

}

private void grdSearch_MouseUp_1(object sender,
System.Windows.Forms.MouseEventArgs e)
{
try
{
DataRowView drvSelectedGridRow =
(DataRowView)grdSearch.BindingContext
[grdSearch.DataSource,grdSearch.DataMember].Current;

string sNodeName =
drvSelectedGridRow["title"].ToString().Trim();
string sSnpID = drvSelectedGridRow[""].ToString().Trim();

TreeNode tnWrHistoryRootNode = new TreeNode(sNodeName);
tnWrHistoryRootNode.Tag = sSnpID;

string dataSource;
dataSource = grdSearch.DataSource.ToString();
grdSearch.DoDragDrop(tnWrHistoryRootNode,DragDropEffects.Move);
}
catch{}
}

private void grdSearch_DragEnter (object sender,
System.Windows.Forms.DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}

private void grdSearch_DragOver(object sender,
System.Windows.Forms.DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}

private void tvMain_DragDrop (object sender,
System.Windows.Forms.DragEventArgs e)
{
TreeNode tnNewNode = new TreeNode();

if(e.Data.GetDataPresent("System.Windows.Forms.TreeNode",false))
{
Point pt;
TreeNode tnDestinationNode = new TreeNode();
pt = tvMain.PointToClient(new Point(e.X, e.Y));
tnDestinationNode = tvMain.GetNodeAt(pt);
tnNewNode =
(TreeNode) e.Data.GetData("System.Windows.Forms.TreeNode");

int iNodeCount = tvMain.GetNodeCount(false);

if(iNodeCount == 0)
{
this.tvMain.Nodes.Add(tnNewNode);
}
else
{
if(!tnDestinationNode.Equals(tnNewNode))
{
tnDestinationNode.Nodes.Add((TreeNode) tnNewNode.Clone());
try
{
tnNewNode.Remove();
}
catch{}
tvMain.ExpandAll();
}
}
}
}

private void tvMain_DragEnter (object sender,
System.Windows.Forms.DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}

private void tvMain_ItemDrag (object sender,
System.Windows.Forms.ItemDragEventArgs e)
{
DoDragDrop(e.Item, DragDropEffects.Move);
}

}
}
 
M

Mohamoss

hi
here is a working drag and drop example , form two lists whoever , try to
look at it , hope it helps
using System;
using System.Drawing;
using System.Windows.Forms;

namespace Snip_DragNDrop
{
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.ListBox ListDragSource;
private System.Windows.Forms.ListBox ListDragTarget;
private System.Windows.Forms.CheckBox UseCustomCursorsCheck;
private System.Windows.Forms.Label DropLocationLabel;

private int indexOfItemUnderMouseToDrag;
private int indexOfItemUnderMouseToDrop;

private Rectangle dragBoxFromMouseDown;
private Point screenOffset;

private Cursor MyNoDropCursor;
private Cursor MyNormalCursor;

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

public Form1()
{
this.ListDragSource = new System.Windows.Forms.ListBox();
this.ListDragTarget = new System.Windows.Forms.ListBox();
this.UseCustomCursorsCheck = new System.Windows.Forms.CheckBox();
this.DropLocationLabel = new System.Windows.Forms.Label();

this.SuspendLayout();

// ListDragSource
this.ListDragSource.AllowDrop = true;
this.ListDragSource.Items.AddRange(new object[] {"one", "two", "three",
"four",
"five", "six", "seven", "eight",
"nine", "ten"});
this.ListDragSource.Location = new System.Drawing.Point(10, 17);
this.ListDragSource.Size = new System.Drawing.Size(120, 225);
this.ListDragSource.MouseDown += new
System.Windows.Forms.MouseEventHandler(this.ListDragSource_MouseDown);
this.ListDragSource.QueryContinueDrag += new
System.Windows.Forms.QueryContinueDragEventHandler(this.ListDragSource_Query
ContinueDrag);
this.ListDragSource.MouseUp += new
System.Windows.Forms.MouseEventHandler(this.ListDragSource_MouseUp);
this.ListDragSource.MouseMove += new
System.Windows.Forms.MouseEventHandler(this.ListDragSource_MouseMove);
this.ListDragSource.GiveFeedback += new
System.Windows.Forms.GiveFeedbackEventHandler(this.ListDragSource_GiveFeedba
ck);
this.ListDragSource.DragDrop += new
System.Windows.Forms.DragEventHandler(this.ListDragTarget_DragDrop);
// ListDragTarget
this.ListDragTarget.AllowDrop = true;
this.ListDragTarget.Location = new System.Drawing.Point(154, 17);
this.ListDragTarget.Size = new System.Drawing.Size(120, 225);
//this.ListDragTarget.DragOver += new
System.Windows.Forms.DragEventHandler(this.ListDragTarget_DragOver);
this.ListDragTarget.DragDrop += new
System.Windows.Forms.DragEventHandler(this.ListDragTarget_DragDrop);
this.ListDragTarget.DragEnter += new
System.Windows.Forms.DragEventHandler(this.ListDragTarget_DragEnter);
//this.ListDragTarget.DragLeave += new
System.EventHandler(this.ListDragTarget_DragLeave);

// UseCustomCursorsCheck
this.UseCustomCursorsCheck.Location = new System.Drawing.Point(10, 243);
this.UseCustomCursorsCheck.Size = new System.Drawing.Size(137, 24);
this.UseCustomCursorsCheck.Text = "Use Custom Cursors";

// DropLocationLabel
this.DropLocationLabel.Location = new System.Drawing.Point(154, 245);
this.DropLocationLabel.Size = new System.Drawing.Size(137, 24);
this.DropLocationLabel.Text = "None";

// Form1
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 270);
this.Controls.AddRange(new System.Windows.Forms.Control[]
{this.ListDragSource,
this.ListDragTarget, this.UseCustomCursorsCheck,
this.DropLocationLabel});
this.Text = "Drag and Drop Example";

this.ResumeLayout(false);

}

private void ListDragSource_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e)
{
// Get the index of the item the mouse is below.
indexOfItemUnderMouseToDrag = ListDragSource.IndexFromPoint(e.X, e.Y);

if (indexOfItemUnderMouseToDrag != ListBox.NoMatches)
{

// Remember the point where the mouse down occurred. The DragSize
indicates
// the size that the mouse can move before a drag event should be
started.
Size dragSize = SystemInformation.DragSize;

// Create a rectangle using the DragSize, with the mouse position being
// at the center of the rectangle.
dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width
/2),
e.Y - (dragSize.Height /2)), dragSize);
}
else
// Reset the rectangle if the mouse is not over an item in the ListBox.
dragBoxFromMouseDown = Rectangle.Empty;

}

private void ListDragSource_MouseUp(object sender,
System.Windows.Forms.MouseEventArgs e)
{
// Reset the drag rectangle when the mouse button is raised.
dragBoxFromMouseDown = Rectangle.Empty;
}

private void ListDragSource_MouseMove(object sender,
System.Windows.Forms.MouseEventArgs e)
{

if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
{

// If the mouse moves outside the rectangle, start the drag.
if (dragBoxFromMouseDown != Rectangle.Empty &&
!dragBoxFromMouseDown.Contains(e.X, e.Y))
{

// Create custom cursors for the drag-and-drop operation.
try
{
MyNormalCursor = new Cursor("3dwarro.cur");
MyNoDropCursor = new Cursor("3dwno.cur");

}
catch
{
// An error occurred while attempting to load the cursors, so use
// standard cursors.
UseCustomCursorsCheck.Checked = false;
}
finally
{

// The screenOffset is used to account for any desktop bands
// that may be at the top or left side of the screen when
// determining when to cancel the drag drop operation.
screenOffset = SystemInformation.WorkingArea.Location;

// Proceed with the drag and drop, passing in the list item.

DragDropEffects dropEffect =
ListDragSource.DoDragDrop(ListDragSource.Items[indexOfItemUnderMouseToDrag],
DragDropEffects.All | DragDropEffects.Link);

// If the drag operation was a move then remove the item.
if (dropEffect == DragDropEffects.Move)
{
ListDragSource.Items.RemoveAt(indexOfItemUnderMouseToDrag);

// Selects the previous item in the list as long as the list has an
item.
if (indexOfItemUnderMouseToDrag > 0)
ListDragSource.SelectedIndex = indexOfItemUnderMouseToDrag -1;

else if (ListDragSource.Items.Count > 0)
// Selects the first item.
ListDragSource.SelectedIndex =0;
}

// Dispose of the cursors since they are no longer needed.
if (MyNormalCursor != null)
MyNormalCursor.Dispose();

if (MyNoDropCursor != null)
MyNoDropCursor.Dispose();
}
}
}
}
private void ListDragSource_GiveFeedback(object sender,
System.Windows.Forms.GiveFeedbackEventArgs e)
{
// Use custom cursors if the check box is checked.
if (UseCustomCursorsCheck.Checked)
{

// Sets the custom cursor based upon the effect.
e.UseDefaultCursors = false;
if ((e.Effect & DragDropEffects.Move) == DragDropEffects.Move)
Cursor.Current = MyNormalCursor;
else
Cursor.Current = MyNoDropCursor;
}

}
private void ListDragTarget_DragOver(object sender,
System.Windows.Forms.DragEventArgs e)
{

// Determine whether string data exists in the drop data. If not, then
// the drop effect reflects that the drop cannot occur.
if (!e.Data.GetDataPresent(typeof(System.String)))
{

e.Effect = DragDropEffects.None;
DropLocationLabel.Text = "None - no string data.";
return;
}

// Set the effect based upon the KeyState.
if ((e.KeyState & (8+32)) == (8+32) &&
(e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link)
{
// KeyState 8 + 32 = CTL + ALT

// Link drag and drop effect.
e.Effect = DragDropEffects.Link;

}
else if ((e.KeyState & 32) == 32 &&
(e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link)
{

// ALT KeyState for link.
e.Effect = DragDropEffects.Link;

}
else if ((e.KeyState & 4) == 4 &&
(e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move)
{

// SHIFT KeyState for move.
e.Effect = DragDropEffects.Move;

}
else if ((e.KeyState & 8) == 8 &&
(e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy)
{

// CTL KeyState for copy.
e.Effect = DragDropEffects.Copy;

}
else if ((e.AllowedEffect & DragDropEffects.Move) ==
DragDropEffects.Move)
{

// By default, the drop action should be move, if allowed.
e.Effect = DragDropEffects.Move;

}
else
e.Effect = DragDropEffects.None;

// Get the index of the item the mouse is below.

// The mouse locations are relative to the screen, so they must be
// converted to client coordinates.

indexOfItemUnderMouseToDrop =
ListDragTarget.IndexFromPoint(ListDragTarget.PointToClient(new
Point(e.X, e.Y)));

// Updates the label text.
if (indexOfItemUnderMouseToDrop != ListBox.NoMatches)
{

DropLocationLabel.Text = "Drops before item #" +
(indexOfItemUnderMouseToDrop + 1);
}
else
DropLocationLabel.Text = "Drops at the end.";

}
private void ListDragTarget_DragDrop(object sender,
System.Windows.Forms.DragEventArgs e)
{
// Ensure that the list item index is contained in the data.
if (e.Data.GetDataPresent(typeof(System.String)))
{

Object item = (object)e.Data.GetData(typeof(System.String));

// Perform drag and drop, depending upon the effect.
if (e.Effect == DragDropEffects.Copy ||
e.Effect == DragDropEffects.Move)
{

// Insert the item.
if (indexOfItemUnderMouseToDrop != ListBox.NoMatches)
ListDragTarget.Items.Insert(indexOfItemUnderMouseToDrop, item);
else
ListDragTarget.Items.Add(item);

}
}
// Reset the label text.
DropLocationLabel.Text = "None";
}
private void ListDragSource_QueryContinueDrag(object sender,
System.Windows.Forms.QueryContinueDragEventArgs e)
{
// Cancel the drag if the mouse moves off the form.
ListBox lb = sender as ListBox;

if (lb != null)
{

Form f = lb.FindForm();

// Cancel the drag if the mouse moves off the form. The screenOffset
// takes into account any desktop bands that may be at the top or left
// side of the screen.
if (((Control.MousePosition.X - screenOffset.X) < f.DesktopBounds.Left)
||
((Control.MousePosition.X - screenOffset.X) > f.DesktopBounds.Right) ||
((Control.MousePosition.Y - screenOffset.Y) < f.DesktopBounds.Top) ||
((Control.MousePosition.Y - screenOffset.Y) > f.DesktopBounds.Bottom))
{

e.Action = DragAction.Cancel;
}
}
}
private void ListDragTarget_DragEnter(object sender,
System.Windows.Forms.DragEventArgs e)
{
// Reset the label text.
DropLocationLabel.Text = "None";
}
private void ListDragTarget_DragLeave(object sender, System.EventArgs e)
{
// Reset the label text.
DropLocationLabel.Text = "None";
}
}
}

Mohamed Mahfouz
MEA Developer Support Center
ITworx on behalf of Microsoft EMEA GTSC
 
M

Mohamoss

Great :)
Mohamed Mahfouz
MEA Developer Support Center
ITworx on behalf of Microsoft EMEA GTSC
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top