2016-10-05 12 views
3

残念ながらDataGridViewではなく、ReadOnly DataGridでセルをダブルクリックすると処理する必要がありますが、MouseDoubleClickイベントは処理されません解雇される。どうすればイベントを発動できますか?System.Windows.Forms.DataGridでセルをダブルクリックしたときにMouseDoubleClickイベントが発生しない

は、私は、DataGridを作成し、イベントをサブスクライブしている:私はセルの境界をダブルクリックした場合にのみ

var table = new DataTable(); 
table.Columns.Add("foo"); 
table.Rows.Add(new object[] { "foo" }); 
table.Rows.Add(new object[] { "foo" }); 
dataGrid1.DataSource = table; 
dataGrid1.MouseDoubleClick += DataGrid1_MouseDoubleClick; 
dataGrid1.ReadOnly = true; 

イベントがあります。

enter image description here

私は、彼らが同じくらい言うan old thread in Experts Exchange、見つかった:

まあ、だけではありませんが、私はセルをクリックすると読み取り専用のテキストボックスには、第2のクリックイベントを食べるように思われ表示されますダブルクリックイベントは、セルをクリックするとキャプチャされず、データグリッドメッセージキューによって捕捉されていません。私はデータグリッドを継承し、ダブルクリックを検出できるかどうかを確認するためにwndprocをオーバーロードしました。クリックメッセージをキャプチャしますが、WM_LBUTTONDBLCLKメッセージは送信されません。私は、MSが子コントロール(DataGridColumnStyleクラスとデリバティブを参照)をグリッドコントロールにフックして、メッセージがグリッドに続行されないようにしていると思われます。その子供やグリッドをあらかじめフックしようとするとかなり厄介な結果になる可能性があるので、私はそれを避けています。

私は実際にTextBoxコントロールを必要としないので、セルを "アクティブ化"または表示する方法があれば、私にとっても十分な解決策になります。

注:私はDataGridが廃止されていることを知っていますが、私は従来のコードを扱っています。DataGridViewを使用するようにコメントしないでください。

+0

あなたの代わりにダブルクリックのセル上の簡単なクリックイベントを処理してもらえますか? – Nofuzy

+0

グリッドをアクティブにする必要がない場合は、マウスのクリックをキャプチャするために透明コントロールを上に置くことができますか? – Equalsk

+0

@Equalsk面白いアイデア。グリッドと一緒にコントロールをサイズ変更する必要がありますが、おそらくアンカーでそれを達成できます。ヘッダー行をクリックして列幅のサイズを変更し、並べ替えを変更できるようにするには、セル上で行う必要があります。 – sashoalm

答えて

1

セルでマウスがダウンすると、TextBox編集コントロールがフォーカスを取得し、その他のマウスの上下を受信するため、ダブルクリックイベントDataGridは発生しません。

DataGridは読み取り専用なので、DataGridTextBoxColumnを編集コントロールを表示しないように変更できます。このようにダブルクリックイベントが発生します。そうするために、それはEditメソッドのこのオーバーロードをオーバーライドして、何もしないように十分です:

public class MyDataGridTextBoxColumn : DataGridTextBoxColumn 
{ 
    protected override void Edit(CurrencyManager source, int rowNum, 
     Rectangle bounds, bool readOnly, string displayText, bool cellIsVisible) 
    { 
    } 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    var dt = new DataTable(); 
    dt.Columns.Add("A"); 
    dt.Columns.Add("B"); 
    dt.Rows.Add("1", "11"); 
    dt.Rows.Add("2", "22"); 
    var dg = new DataGrid(); 
    dg.Dock = DockStyle.Fill; 
    this.Controls.Add(dg); 
    dg.BringToFront(); 
    dg.DataSource = dt; 
    var ts = new DataGridTableStyle(); 
    ts.GridColumnStyles.Add(new MyDataGridTextBoxColumn() { MappingName = "A" }); 
    ts.GridColumnStyles.Add(new MyDataGridTextBoxColumn() { MappingName = "B" }); 
    dg.TableStyles.Add(ts); 
    dg.DoubleClick += dg_DoubleClick; 
} 
void dg_DoubleClick(object sender, EventArgs e) 
{ 
    MessageBox.Show("DoubleClick!"); 
} 
関連する問題