web-dev-qa-db-ja.com

ドラッグアンドドロップを使用してwinformsリストボックスを並べ替えますか?

これは簡単なプロセスですか?

私は、内部ツール用の簡単なハックUIのみを作成しています。

年齢をかけたくないです。

39
Gareth Simpson

これは、簡単で汚れたアプリです。基本的に、ボタンとListBoxを持つフォームを作成しました。ボタンをクリックすると、ListBoxに次の20日間の日付が入力されます(テストのためだけに使用する必要があります)。次に、ListBox内でドラッグアンドドロップして並べ替えることができます。

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.listBox1.AllowDrop = true;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i <= 20; i++)
            {
                this.listBox1.Items.Add(DateTime.Now.AddDays(i));
            }
        }

        private void listBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if (this.listBox1.SelectedItem == null) return;
            this.listBox1.DoDragDrop(this.listBox1.SelectedItem, DragDropEffects.Move);
        }

        private void listBox1_DragOver(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Move;
        }

        private void listBox1_DragDrop(object sender, DragEventArgs e)
        {
            Point point = listBox1.PointToClient(new Point(e.X, e.Y));
            int index = this.listBox1.IndexFromPoint(point);
            if (index < 0) index = this.listBox1.Items.Count-1;
            object data = e.Data.GetData(typeof(DateTime));
            this.listBox1.Items.Remove(data);
            this.listBox1.Items.Insert(index, data);
        }
82
BFree

7年後期。しかし、初めての人のために、ここにコードがあります。

private void listBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (this.listBox1.SelectedItem == null) return;
        this.listBox1.DoDragDrop(this.listBox1.SelectedItem, DragDropEffects.Move);
    }

    private void listBox1_DragOver(object sender, DragEventArgs e)
    {
        e.Effect = DragDropEffects.Move;
    }

    private void listBox1_DragDrop(object sender, DragEventArgs e)
    {
        Point point = listBox1.PointToClient(new Point(e.X, e.Y));
        int index = this.listBox1.IndexFromPoint(point);
        if (index < 0) index = this.listBox1.Items.Count - 1;
        object data = listBox1.SelectedItem;
        this.listBox1.Items.Remove(data);
        this.listBox1.Items.Insert(index, data);
    }

    private void itemcreator_Load(object sender, EventArgs e)
    {
        this.listBox1.AllowDrop = true;
    }
8
Wally Modz

ドラッグアンドドロップを一度も実装したことがなく、正しく実行してドキュメントを読む必要がある場合、最初は数時間かかります。特に、ユーザーが操作をキャンセルした場合の即時のフィードバックとリストの復元には、いくつかの考慮が必要です。動作を再利用可能なユーザーコントロールにカプセル化するのにも時間がかかります。

ドラッグアンドドロップをまったく行ったことがない場合は、MSDNの ドラッグアンドドロップの例 をご覧ください。これは良い出発点となるでしょう、そしてそれがうまくいくのに多分半日かかるはずです。

3

別の方法としては、エクスプローラーがフォルダーの内容を表示するために使用するコントロールである list-view コントロールを使用します。より複雑ですが、アイテムのドラッグを実装します。

0
Simon Buchan