- PR -

textBoxのドラッグ&ドロップ

1
投稿者投稿内容
カズ
会議室デビュー日: 2004/02/20
投稿数: 9
投稿日時: 2005-04-07 11:01
textBoxの選択された文字列をドラッグしたいのですが、
MouseDownイベントでDoDragDropメソッドを呼び出すと選択状態が解除されてしまうためうまくいきません。
解決方法をご存知の型がいらっしゃいましたら教えてくださいませんか?

private void TextBox_MouseDown(object sender, MouseEventArgs e) {
  TextBox target = (TextBox)sender;
  if(target.SelectionLength != 0){
    target.DoDragDrop(target.SelectedText,DragDropEffects.Copy);
  }
}

private void TextBox_DragEnter(object sender, DragEventArgs e) {
  if(e.Data.GetDataPresent(DataFormats.Text)){
    if(e.KeyState == (int)Keys.Control){
      e.Effect = DragDropEffects.Copy;
    }
    else{
      e.Effect = DragDropEffects.Move;
    }
  }
  else{
    e.Effect = DragDropEffects.None;
  }
}

private void TextBox_DragDrop(object sender, DragEventArgs e) {
  TextBox target = (TextBox)sender;
  target.SelectedText = (string)e.Data.GetData(DataFormats.Text);
}


[ メッセージ編集済み 編集者: カズ 編集日時 2005-04-07 11:01 ]
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-04-07 15:31
引用:
MouseDownイベントでDoDragDropメソッドを呼び出すと選択状態が解除されてしまうため

テキストボックス上でマウスの左ボタンをMouseDownしたら選択状態が解除されるのは
普通の動作ですよね。(右クリックなら平気かも?)

引用:
textBoxの選択された文字列をドラッグしたいのですが、

どこからどこにドラッグするのですか?提示されたイベントハンドラのコードは
データを渡す側ですか?受け取る側ですか?(両方が混ざってる感じ)

一応
http://ukamen.hp.infoseek.co.jp/Programming1/DragAndDrop/#SEC5
カズ
会議室デビュー日: 2004/02/20
投稿数: 9
投稿日時: 2005-04-08 23:58
引用:

テキストボックス上でマウスの左ボタンをMouseDownしたら選択状態が解除されるのは
普通の動作ですよね。(右クリックなら平気かも?)


VS.NETのコードエディタのような動作をさせたいのですが…

引用:
textBoxの選択された文字列をドラッグしたいのですが、どこからどこにドラッグするのですか?提示されたイベントハンドラのコードは
データを渡す側ですか?受け取る側ですか?(両方が混ざってる感じ)


両方なのです。受け取ることもあれば渡すこともあるので…
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-04-09 01:41
MouseDownでドラッグ開始するから範囲選択できなくなるので不便だと思いますが、
たとえば、
MouseMoveでSelectionStartとSelectionLengthを覚えといてMouseDownでSelectする。

私だったら右クリックドラッグで対応させますけどね。それかボタンを押させる。

#コードエディタは範囲選択されている場合、マウスのボタンを押してから離すまでの
#長さによって動作が違っているような気がします。
カズ
会議室デビュー日: 2004/02/20
投稿数: 9
投稿日時: 2005-04-09 11:47
引用:

MouseDownでドラッグ開始するから範囲選択できなくなるので不便だと思いますが、


確かにそれは不便ですね…
ドラッグ&ドロップは必須の機能ではないので、どうしてもうまくいかないようなら諦めます。
べるさん、丁寧な回答ありがとうございました。
冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2005-04-09 13:26
引用:

カズさんの書き込み (2005-04-08 23:58) より:
VS.NETのコードエディタのような動作をさせたいのですが…


VS.NET使ってないから勘違いしてるかもしれないけど

textBoxの回りに、少しつかめる領域、というかミミみたいな部分があったりしませんか?
dragableTextBoxなんて名前を付けて、移動できるクラスにしてしまうというのはどうでしょう?
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2005-04-09 14:22
勘違いかと。>冬寂さん
wordpadにこの機能がある(XPで確認)ので試してみるといいかも。
wordpadを二つ起動し、そのうちの一つで範囲選択した後、その選択部分の上でMouseDown、そのまま別のwordpadにもっていってMouseUpしてみてください。同じwordpadの中でも移動できます。

ところで、wordpadにこの機能があるので、RichTextBoxにもあるんじゃないだろうか…と思ってやってみたらDnDは出来るようですけど、自コントロール内、ほかのコントロールともに落とせません。
なにかフォーマットが変なのか変な動作がはいっているのか…。
カズ
会議室デビュー日: 2004/02/20
投稿数: 9
投稿日時: 2005-04-10 13:16
引用:

RichTextBoxにもあるんじゃないだろうか…


試しにRichTextBoxを継承するクラスを作ってOnDragEnterとOnDragDropをオーバーライドしてみたら、2回に1回ドラッグ&ドロップができるという変な状況になりました。
ドラッグ&ドロップを実装するのは諦めかけてますが、どうなってるのかが気になります…
1

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