- PR -

ListView上のItem移動

1
投稿者投稿内容
Rudy☆
会議室デビュー日: 2004/11/10
投稿数: 3
投稿日時: 2004-11-10 15:08
初めまして。C#初心者です。
ListViewに登録したListViewItemをアイコン表示したときに、
エクスプローラで「アイコンの自動整列」のチェックを外した時みたく、
ListVeiew内の任意の場所にDrag&Dropして移動させたいのですが、
どういう処理を行えばよいかわかりません。
ListViewItemに対し、Location見たいのがあればよいのですが、
見つからないもので・・・。
ご存知の方、宜しくお願いします。
p
会議室デビュー日: 2004/10/20
投稿数: 7
投稿日時: 2004-11-11 00:23
http://ukamen.hp.infoseek.co.jp/Programming1/DragAndDrop/#SEC7

こちらの記事が参考になるのではないかと思います。
Rudy☆
会議室デビュー日: 2004/11/10
投稿数: 3
投稿日時: 2004-11-11 13:39
Pさん、レスありがとうございます。
参考URLの記事でやっている、ListViewからTreeViewへのDrag&Dropは出来たのですが、
ListView内での自由配置がわからなく・・・
根本的にListViewコントロールでは出来ないんでしょうかね・・・(^^;
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2004-11-12 08:03
コード:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace test
{
  public class ListViewEx : ListView
  {
    public ListViewEx()
    {
      this.AutoArrange = false;
    }

    [DefaultValue(false)]
    public new bool AutoArrange
    {
      get
      {
        return base.AutoArrange;
      }
      set
      {
        base.AutoArrange = value;
      }
    }

    [StructLayout(LayoutKind.Sequential)]
    private struct tagPOINT
    {
      int x;
      int y;
      public tagPOINT(int x, int y)
      {
        this.x = x;
        this.y = y;
      }
    }
    [DllImport("user32.dll")]
    private extern static int SendMessage
      (IntPtr hWnd, uint message, int index, ref tagPOINT p);
    private const uint LVM_FIRST = 0x1000;
    private const uint LVM_SETITEMPOSITION32 = LVM_FIRST + 49;
    public void SetItemPosition(int index, Point point)
    {
      if( index < 0 || this.Items.Count <= index)
        throw new ArgumentOutOfRangeException("index");

      tagPOINT p = new tagPOINT(point.X, point.Y);
      SendMessage(this.Handle, LVM_SETITEMPOSITION32, index, ref p);
    }
  }
}



デフォルトではなさげなので、ListViewの代わりにこれを使ってみてください。
ListViewEx.SetItemPosition(アイテムのインデックス, 移動先の座標)でアイテムの位置を移動できます。

ただ、ざっと書いてみただけなので、どっかで不整合が出るかもしれません。なので、なるべく理解してから使うことをすすめます。

#あ、ListViewItemに実装してもいいかもしれない。
Rudy☆
会議室デビュー日: 2004/11/10
投稿数: 3
投稿日時: 2004-11-12 11:12
yaさん、レスありがとうございます。
試してみたところ動きました!
yaさんの言うとおり、処理内容を理解した上で使用したいと思います。

やはりC#で実装されていない処理はアンマネージドで実装するしかないんでしょうかね。
僕はJavaからC#へ移ってきたので、
コード自体はJavaぽくて取っ付き易いんですが、
VC++の知識があまり無いので、結構ハマリやすいです。(^^;
1

スキルアップ/キャリアアップ(JOB@IT)