C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 別フォームのDataGridViewへドラッグアンドドロップ


(過去ログ 112 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■66243 / inTopicNo.1)  別フォームのDataGridViewへドラッグアンドドロップ
  
□投稿者/ ごっちゃん (1回)-(2013/04/10(Wed) 19:33:09)

分類:[C#] 

C#とあるサイトからサンプルを持ってきて
同一フォーム内の2つのDataGridViewで
ドラッグアンドドロップを行う処理が出来ています。
カラム数はどちらも同じです。

そこで今やりたいことは、親フォーム(Form1)にdataGridView1を
子フォーム(form2)にdataGridView2を作成して親フォームから
子フォームへドラッグアンドドロップしてデータを渡す処理を作ろうとしています。

どこを改変してゆけばよいでしょうか?

public Form1()
{
InitializeComponent();
this.Load+=new EventHandler(Form1_Load);

dataGridView1.MouseDown+=new MouseEventHandler(dataGridView1_MouseDown);
dataGridView2.DragEnter+=new DragEventHandler(dataGridView2_DragEnter);
dataGridView2.DragDrop+=new DragEventHandler(dataGridView2_DragDrop);
//とりあえず表示
form2.Show();
}

private void Form1_Load(object sender, EventArgs e)
{
// テストの準備
// ドロップ元
dataGridView1.Columns.Add("Col1", "Col1");
dataGridView1.Columns.Add("Col2", "Col2");
dataGridView1.Rows.Add("1-1", "1-2");
dataGridView1.Rows.Add("2-1", "2-2");
dataGridView1.Rows.Add("3-1", "3-2");
// ドロップ先
dataGridView2.Columns.Add("Col1", "Col1");
dataGridView2.Columns.Add("Col2", "Col2");
dataGridView2.Rows.Add("A-1", "A-2");
dataGridView2.AllowDrop = true;
}

private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
{
DataGridView.HitTestInfo hit = dataGridView1.HitTest(e.X, e.Y);

// 念のため、有効なセル上でのみ許可する
if (hit.Type == DataGridViewHitTestType.Cell
&& (dataGridView1.NewRowIndex == -1
|| dataGridView1.NewRowIndex != hit.RowIndex))
{
dataGridView1.DoDragDrop(
dataGridView1.Rows[hit.RowIndex], DragDropEffects.Copy);
}
}

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

private void dataGridView2_DragDrop(object sender, DragEventArgs e)
{
Point clientPoint = dataGridView2.PointToClient(new Point(e.X, e.Y));
DataGridView.HitTestInfo hit =
dataGridView2.HitTest(clientPoint.X, clientPoint.Y);

// ドロップするデータ
DataGridViewRow dgvr =
(DataGridViewRow)e.Data.GetData(typeof(DataGridViewRow));
object[] cellData = new object[dgvr.Cells.Count];
for (int col = 0; col < dgvr.Cells.Count; col++)
cellData[col] = dgvr.Cells[col].Value;

// 追加
if (hit.RowIndex != -1)
dataGridView2.Rows.Insert(hit.RowIndex, cellData);
else
dataGridView2.Rows.Add(cellData);
}


環境は、.NET Framework2.0 windows7
引用返信 編集キー/
■66247 / inTopicNo.2)  Re[1]: 別フォームのDataGridViewへドラッグアンドドロップ
□投稿者/ Azulean (131回)-(2013/04/10(Wed) 21:44:03)
渡すべきデータが十分なら、Form1 側は変えなくてもよいとは思います。(ソースコードを十分に査読していないので何かが引っかかるポイントが埋もれている可能性はあります)
Form2 にドロップできない状態なら、プロパティ(AllowDrop)を設定できていないか、イベントハンドラ(DragEnter/DragDrop)を適切に設定できていないかだと予想されます。

とりあえず、試してみませんか。
(ポイントは、DoDrag に渡しているデータが Form2 で受け取るのにふさわしい内容になっているかですが、内容からすると、問題なさそうに見えています)
引用返信 編集キー/
■66256 / inTopicNo.3)  Re[2]: 別フォームのDataGridViewへドラッグアンドドロップ
□投稿者/ ごっちゃん (2回)-(2013/04/11(Thu) 14:05:22)
No66247 (Azulean さん) に返信
> 渡すべきデータが十分なら、Form1 側は変えなくてもよいとは思います。(ソースコードを十分に査読していないので何かが引っかかるポイントが埋もれている可能性はあります)
> Form2 にドロップできない状態なら、プロパティ(AllowDrop)を設定できていないか、イベントハンドラ(DragEnter/DragDrop)を適切に設定できていないかだと予想されます。
> 
> とりあえず、試してみませんか。
> (ポイントは、DoDrag に渡しているデータが Form2 で受け取るのにふさわしい内容になっているかですが、内容からすると、問題なさそうに見えています)

Form2にdataGridView2を作成し、DragDropを以下のように変更して試して見ました。

e.Data.GetData(typeof(DataGridView))がnullで帰ってきます。
同じDataGridViewだとしても、ドラッグ時の送り側のデータ型の指定、ドロップ時の受け取り側のデータ型の指定が必要なのでしょうか?



        private void dataGridView1_DragDrop(object sender, DragEventArgs e)
        {
            Point clientPoint = dataGridView1.PointToClient(new Point(e.X, e.Y));
            DataGridView.HitTestInfo hit =
            dataGridView1.HitTest(clientPoint.X, clientPoint.Y);

            if (hit.RowIndex != -1)
            {
                dataGridView1.Rows.Insert(hit.RowIndex, e.Data.GetData(typeof(DataGridView)));
            }
        }


引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -