移动C#中复选框列表中的复选框 [英] Move checkbox in checkbox list in C#

查看:115
本文介绍了移动C#中复选框列表中的复选框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

int itemIndex = 0;
       private void Form1_Load(object sender, EventArgs e)
       {
           checkedListBox1.Items.Add("Item 1");
           checkedListBox1.Items.Add("Item 2");
           checkedListBox1.Items.Add("Item 3");
           checkedListBox1.Items.Add("Item 4");
           checkedListBox1.Items.Add("Item 5");
           checkedListBox1.Items.Add("Item 6");
       }

       private void checkedListBox1_MouseDown(object sender, MouseEventArgs e)
       {
           CheckedListBox clb = sender as CheckedListBox;
           itemIndex = clb.IndexFromPoint(e.X, e.Y);
           if (itemIndex >= 0 & e.Button == MouseButtons.Left)
           {
               clb.DoDragDrop(clb.Items[itemIndex], DragDropEffects.Move);
           }
       }

       private void checkedListBox1_DragDrop(object sender, DragEventArgs e)
       {
           if (e.Data.GetDataPresent(typeof(System.String)))
           {
               e.Effect = DragDropEffects.Move;
           }
           else
           {
               e.Effect = DragDropEffects.None;
           }

       }

       private void checkedListBox1_DragOver(object sender, DragEventArgs e)
       {
           CheckedListBox clbSender = sender as CheckedListBox;
           clbSender.Items.Add(e.Data.GetData(typeof(System.String)).ToString());

           if (clbSender.Name == "checkedListBoxA")
               checkedListBox1.Items.RemoveAt(itemIndex);
           else
               checkedListBox1.Items.RemoveAt(itemIndex);

       }
   }





我的尝试:



i尝试上面的代码,但它不起作用。



What I have tried:

i tried above code but it does not work.

推荐答案

第一个问题是代码在 DragOver 事件中,需要在 DragDrop 事件中,反之亦然。该代码也存在一些小问题。



不需要模块级变量 itemIndex 在需要时声明并计算它。



这是你的代码修改工作(并复制项目的检查状态)。请注意,如果您希望用户能够选中您需要将CheckOnClick设置为True的框。

First problem is the code in the DragOver event needs to be in the DragDrop event and vice versa. There are also some minor issues with that code.

There is no need for the module level variable itemIndex just declare and calculate it when you need it.

This is your code amended to work (and to also copy the checked state of the item). Note if you want the user to be able to check the boxes you will need to set CheckOnClick to True.
private void checkedListBox1_MouseDown(object sender, MouseEventArgs e)
{
    CheckedListBox clb = sender as CheckedListBox;

    var itemIndex = clb.IndexFromPoint(e.X, e.Y);
    if (itemIndex >= 0 & e.Button == MouseButtons.Left)
    {
        clb.DoDragDrop(clb.Items[itemIndex], DragDropEffects.Move);
    }
}

private void checkedListBox1_DragDrop(object sender, DragEventArgs e)
{

    CheckedListBox clbSender = sender as CheckedListBox;

    if (clbSender == null) return;

    var point = clbSender.PointToClient(new Point(e.X, e.Y));
    var index = clbSender.IndexFromPoint(point);
    if (index < 0) index = clbSender.Items.Count - 1;

    var data = clbSender.SelectedItem;
    var isChecked = clbSender.GetItemChecked(clbSender.SelectedIndex);

    clbSender.Items.RemoveAt(clbSender.SelectedIndex);
    clbSender.Items.Insert(index, data);
    clbSender.SetItemChecked(index, isChecked);
}

private void checkedListBox1_DragOver(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(typeof(System.String)))
        e.Effect = DragDropEffects.Move;
    else
        e.Effect = DragDropEffects.None;
}


这篇关于移动C#中复选框列表中的复选框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆