1

自分でイベントを作った経験はほとんどありません。私は現在、フォームとコントロールを使用してイベントを処理しているため、イベントを処理する WinForm の方法に固執しようとしています。

WinForm コントロールには、独自のイベントが既にあります。イベントは特定のデリゲート タイプで作成されるため、イベント中に発生する処理に使用するメソッドのデリゲート シグネチャを一致させる必要があります。私が知る限り、これは、イベント ハンドラーで sourceObjectEventArgs.

DragDrop関連するイベントを介してコントロール間でさまざまな情報を渡す方法を理解しようとしています。さまざまな状況でさまざまなコード スニペットをオンラインで見つけることができましたが、情報が実際にどのように渡されるかをよりよく理解したいと思います。

特にイベントに関してDragDropは、私の情報はDataObject. これは、パラメーターとしてDragDrop.DoDragDropメソッドに渡されます。

ここから私の理解力が低下し始めます。私が見たほとんどの例では、何らかのデータ形式が指定されているようです。データ形式自体は文字列型です。通常、データ形式はデータとともにDataObject.

このデータ形式は何をしていますか? 関連するデータのタイプを示しているだけですか?データ形式がテストされ、データ形式に応じてさまざまなアクションが実行された例を見てきました。タイプを確認するために typeof(YourData) を実行できませんでしたか? データ形式がどのように役立つかわかりません。

http://msdn.microsoft.com/en-us/library/ms741842.aspx

上記のリンクの最初の例は、DataObjectデータ形式が指定されていない状態で作成されていることを示しています。データ形式が自動的に選択され、オブジェクトがデフォルトで変換されることが説明されています。

に任意のオブジェクトを渡すことはできますDataObjectか? 次に、DragDropイベントがターゲット コントロールで発生したときに、そのコントロールは渡されたオブジェクトのメソッドとフィールドにアクセスできますか? または、オブジェクトは によって他の形式に変換されDataObjectますか? いろいろな構造はどうですか?

また、Windows エクスプローラーのアイコンからフォームへのドラッグ アンド ドロップもいくつか行いました。私が見つけたいくつかのサンプルコードを使用して、アイコンのファイルパスを取得できました。また、データ形式を使用しました。

if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
    e.Effect = DragDropEffects.Copy;
}

概要: WinForm イベントを介してデータがどのように渡されるかを理解しようとしています。DragDropさまざまな例で見たもののいくつかを理解できません。データはどういうわけかさまざまな形式で保存されており、そのデータを抽出する方法があることを理解しています。データ形式が何に使用されるのかわかりません。を介して転送できるデータの種類が正確にはわかりませんDataObject。一般的な私の理解EventArgsはかなり不足しています。

私がここで言及したことについて自由にコメントしてください。私が何か間違ったことを述べた場合は、それを指摘してください。この主題をよりよく理解するのに役立つものは何でも感謝します.

編集: これでどこに行く予定かを説明することにしました。誰かが私がやろうとしていることを、私が尋ねたことのいくつかを説明する方法として使用できるかもしれません.

特定の種類のコントロールを含むフォームがあります。コントロールの配置を高度にカスタマイズ可能かつ動的にしようとしています。ユーザーが別のコントロールをフォームに追加するたびに、すべてのコントロールが自動的に再配置され、整理整頓されます。

現在、ユーザーがフォームの周りにコントロールをドラッグして位置を変更できるようにしようとしています。ユーザーがコントロールをドロップすることを決定した場合はいつでも、移動コントロール用のスペースを確保するために、他のすべてのコントロールが邪魔にならないように移動します。

ドラッグされたコントロールとフォーム上の他のすべてのコントロールを適切に移動できるようにするには、ドラッグされたコントロールから特定の情報を取得できる必要があります。イベントを介して渡す必要がある主なデータは、System.Drawing.Point構造体を使用する Location プロパティの形式を取ります。

4

2 に答える 2

1

ここでは、それがどのように行われたかについてのアイデアを提供します。

最初に 2 つのパネルをフォームにドロップし、それらの色を 2 つの異なる色に設定します。

public Form1()
{
    InitializeComponent();

    panel1.MouseDown += new MouseEventHandler(panel1_MouseDown);
    panel2.AllowDrop = true;
    panel2.DragEnter += new DragEventHandler(panel2_DragEnter);
    panel2.DragDrop += new DragEventHandler(panel2_DragDrop);
}

void panel1_MouseDown(object sender, MouseEventArgs e)
{
    panel1.DoDragDrop(panel1, DragDropEffects.Move);
}

void panel2_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetData(typeof(Panel)) != null) e.Effect = DragDropEffects.Move;
}

void panel2_DragDrop(object sender, DragEventArgs e)
{
    Panel p = sender as Panel;//Not needed in this case. Could just write panel2.
    Panel dropped = (Panel)e.Data.GetData(typeof(Panel));
    dropped.Location = p.PointToClient(new Point(e.X, e.Y));
    p.Controls.Add(dropped);
}

次に、panel1 を panel2 にドラッグします。

于 2012-05-01T21:22:36.087 に答える
0

この問題は、ドラッグ アンド ドロップを使用して解決すべきではないと思います。ドラッグ アンド ドロップは、複数のアプリケーションがデータを交換する方法として意図されています。ドラッグしているデータが現在のプロセスにとってのみ意味がある場合は、ドラッグ & ドロップを使用しないでください。

フィールド (たとえば、フォームを含むインスタンスのフィールド) を使用して、必要なすべてのデータを保存できます。

はっきり言って、ドラッグ アンド ドロップはコントロールをドラッグする方法ではありません。とにかく、そのためには多くのカスタム ロジックが必要です。ここでは、dnd の組み込み機能が役立つとは限りません。

于 2012-05-01T21:19:58.417 に答える