拖放操作交换2个元素位置,在拖放事件方法中进行编码:
private void 玩无限消乐_DragDrop(object sender, DragEventArgs e)
{
Point 平面二维 = 玩无限消乐.PointToClient(new Point(e.X, e.Y));
玩无限消乐.Rows[选定坐标[1]].Cells[选定坐标[2]].Value = 玩无限消乐.Rows[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).RowIndex].Cells[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).ColumnIndex].Value;
玩无限消乐.Rows[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).RowIndex].Cells[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).ColumnIndex].Value = (System.Drawing.Bitmap)e.Data.GetData(typeof(System.Drawing.Bitmap));/*System.String*/
}
private void 玩无限消乐_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.All;
}
int[] 选定坐标 = new int[3];
private void 玩无限消乐_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
选定坐标[0] = (int)玩无限消乐.Rows[e.RowIndex].Cells[e.ColumnIndex].Tag;
选定坐标[1] = e.RowIndex; 选定坐标[2] = e.ColumnIndex;
玩无限消乐.DoDragDrop(玩无限消乐.Rows[e.RowIndex].Cells[e.ColumnIndex].Value, DragDropEffects.All);
}
为了记住开始拖放单元格位置,设置全局数组:选定坐标,用于存储行和列的序号及该单元格动画附加代表值;
之上代码直接用拖放事件中的e参数获得事件数据进行交换动画元素,还有一个办法是直接用选定坐标附加值进行交换动画元素:
private void 玩无限消乐_DragDrop(object sender, DragEventArgs e)
{
Point 平面二维 = 玩无限消乐.PointToClient(new Point(e.X, e.Y));
玩无限消乐.Rows[选定坐标[1]].Cells[选定坐标[2]].Value = 玩无限消乐.Rows[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).RowIndex].Cells[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).ColumnIndex].Value;
玩无限消乐.Rows[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).RowIndex].Cells[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).ColumnIndex].Value = new Bitmap("动画素材/e" + 选定坐标[0].ToString() + ".gif");
}
至此,完成了初步的编程,为下次进行动画消除做好预备工作。
private void Form1_Load(object sender, EventArgs e)
{
this.TopMost = true;
//System.Threading.Thread.Sleep(2000);
//玩无限消乐.AllowDrop = true;
玩无限消乐.AllowUserToAddRows = false;
玩无限消乐.AllowUserToOrderColumns = false;
玩无限消乐.AllowUserToResizeColumns = false;
玩无限消乐.AllowUserToResizeRows = false;
玩无限消乐.ReadOnly = true;
玩无限消乐.Anchor = (AnchorStyles.Top | AnchorStyles.Left);
//玩无限消乐.Location = new Point(0, 27);
玩无限消乐.BackgroundColor = System.Drawing.Color.Linen;
玩无限消乐.ColumnHeadersVisible = false;
玩无限消乐.MultiSelect = false;
玩无限消乐.RowHeadersVisible = false;
玩无限消乐.ScrollBars = ScrollBars.None;
//玩无限消乐.Cursor =
//玩无限消乐.Capture = true;
玩无限消乐.AutoSize = true;
//玩无限消乐.ColumnCount = 14;
int 列数 = 0, 数量 = 19;
while (列数++ < 数量)
{ DataGridViewImageColumn 新图列 = new DataGridViewImageColumn(); 玩无限消乐.Columns.Add(新图列); }
玩无限消乐.RowCount = 数量 - 2;
玩无限消乐.AutoResizeColumns();
布局生成();
}
private void 玩无限消乐_DragDrop(object sender, DragEventArgs e)
{
Point 平面二维 = 玩无限消乐.PointToClient(new Point(e.X, e.Y));
玩无限消乐.Rows[选定坐标[1]].Cells[选定坐标[2]].Value = 玩无限消乐.Rows[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).RowIndex].Cells[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).ColumnIndex].Value;//new Bitmap("动画素材/e" + 选定坐标[0].ToString() + ".gif");
玩无限消乐.Rows[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).RowIndex].Cells[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).ColumnIndex].Value = (System.Drawing.Bitmap)e.Data.GetData(typeof(System.Drawing.Bitmap));/*System.String*/
}
private void 玩无限消乐_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.All;
}
int[] 选定坐标 = new int[3];
private void 玩无限消乐_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
选定坐标[0] = (int)玩无限消乐.Rows[e.RowIndex].Cells[e.ColumnIndex].Tag;
选定坐标[1] = e.RowIndex; 选定坐标[2] = e.ColumnIndex;
玩无限消乐.DoDragDrop(玩无限消乐.Rows[e.RowIndex].Cells[e.ColumnIndex].Value, DragDropEffects.All);
}
private void 布局生成()
{
int 列数 = 0, 行数 = 0, 数量 = 19;
while (行数 < 数量 - 2)
{
列数 = 0;
while (列数 < 数量)
{
int 随机数 = new Random(DateTime.Now.Millisecond).Next(100, 119);
if (检查重复(行数, 列数, 随机数) && 检查重复(行数, 列数, 随机数, false))
{
玩无限消除.Rows[行数].Cells[列数].Tag = 随机数;
玩无限消除.Rows[行数].Cells[列数++].Value = new Bitmap("动画素材/e" + 随机数.ToString() + ".gif");
}
}
行数++;
}
}
private bool 检查重复(int 行数, int 列数, int 随机数, bool 控 = true)
{
int 重复 = 0;/*检查前面2个是否重复,从而生成不连续3个重复的*/
if ((控 ? 列数 : 行数) >= 2)
{
int 起数 = (控 ? 列数 : 行数) - 2;
while (起数 < (控 ? 列数 : 行数))
if ((int)玩无限消除.Rows[控 ? 行数 : 起数++].Cells[控 ? 起数++ : 列数].Tag == 随机数)
++重复;
}
return 重复 >= 2 ? false : true;
}