12

ご存知のように、Windows C# のグリッドビューでは、セルのクリック/ダブルクリック イベントを処理する場合、CellClick、CellDoubleClick などのイベントがあります。

だから、私はWPF DataGridでwindows gridviewと同じようにしたい。これまで検索してきましたが、どちらの答えも当てはまりません。それらのいくつかは、MouseDoubleClick イベントを使用すると述べていますが、このイベントでは、各行とその行の項目をチェックする必要があるため、すべてのセルのデータをチェックするのは時間がかかり、ここではタイミングが最も重要です。

私の DataGrid は DataTable にバインドされており、AutoGeneratedColumn は False です。あなたの答えが AutoGeneratedColumn=True に基づいている場合、それは不可能です。さらに、データに応じてデータグリッド セルのスタイルを変更しているので、AutoGeneratedColumn プロパティを変更する方法はありません。

セル クリック/ダブル クリック イベントは、Windows グリッドのイベントと同じくらい高速である必要があります。可能であれば方法を教えてください。そうでない場合は、それを行うための代替手段は何ですか?

私を助けてください.....

どうもありがとう....

4

4 に答える 4

5

別の方法として、 のような定義済みの列を使用する代わりDataGridTemplateColumnに を定義し、データ テンプレートで定義された UI 要素にイベント ハンドラーを追加します。DataGridCheckBoxColumnDataGridComboBoxColumn

以下に、 CellのMouseDownイベント ハンドラーを定義しました。TextBlock

<DataGrid AutoGenerateColumns="False">
    <DataGrid.Columns>

        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock MouseDown="TextBlock_MouseDown"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

コード ビハインド ファイル:

private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
{
    TextBlock block = sender as TextBlock;
    if (block != null)
    {
        // Some Logic
        // block.Text
    }
}
于 2013-01-28T08:32:00.510 に答える
3

WPF のコーディングが PITA になる場合があることは知っています。ここでは、MouseDoubleClickとにかくイベントを処理する必要があります。次に、ソース オブジェクト階層を検索して を見つけ、それを使っDataGridRowて何でもします。

更新: サンプル コード

XAML

<dg:DataGrid MouseDoubleClick="OnDoubleClick" />

コードビハインド

private void OnDoubleClick(object sender, MouseButtonEventArgs e)
{
    DependencyObject source = (DependencyObject) e.OriginalSource;
    var row = GetDataGridRowObject(source);
    if (row == null)
    {
         return;
    }
    else
    {
        // Do whatever with it
    }
    e.Handled = true;
}

private DataGridRow GetDataGridRowObject(DependencyObject source)                               
{
    // Write your own code to recursively traverse up via the source
    // until you find a DataGridRow object. Otherwise return null.
}

}

于 2013-01-28T08:06:15.900 に答える