0

(データ グリッドの複数選択モードを使用するのではなく) DataGrid に DataGridCheckBoxColumn がある場合、どの行がチェックされているかを追跡または検出するにはどうすればよいですか?

行ごとに列挙して列を検査するのに適したプロパティが DataGrid にありますか? DataGrid.ItemsSource は、基になるコレクションを提供します-グリッド行アイテム自体の列を取得できるようにしたい

CheckBox の Click イベントに応答した場合、この CheckBox が属している基になるコレクション内のどの項目のどの行をどのように把握すればよいでしょうか?

<DataGrid x:Name="dgPlayers" AutoGenerateColumns="False" Height="450" CanUserAddRows="False" AlternationCount="2" AlternatingRowBackground="WhiteSmoke" GridLinesVisibility="None">
                <DataGrid.Columns>
                    <DataGridCheckBoxColumn></DataGridCheckBoxColumn>
                    <DataGridTextColumn Header="First Name" Binding="{Binding Path=FirstName}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Last Name" Binding="{Binding Path=LastName}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Position" Binding="{Binding Path=PositionCode, Converter={StaticResource NFLPositionGrouper}}"></DataGridTextColumn>
                    <DataGridTextColumn Header="College" Binding="{Binding Path=CollegeName}"></DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>

ご覧のとおり、DataGridCheckBoxColumn をどのプロパティにもバインドしていません。私の目的は、それを選択に使用することです (はい、DataGrid には複数選択機能が既に組み込まれています...これは純粋に学術的な演習です)。

4

2 に答える 2

1

あなたはこのようなことを試すことができます

 foreach (GridViewRow row in yourgrid.Rows)
    {
        Access the CheckBox
        CheckBox cb = (CheckBox)row.FindControl("youcheckboxid");
        if (cb != null && cb.Checked==true)
        {

          //you should now know the row where the checkbox was cheked 
         }
    }
于 2012-08-19T06:19:31.553 に答える
0

.Rows コレクションを介して ASP.NET で行うように、各 DataGridRow を列挙する方法を理解することはできませんでしたが、とにかくこれは良い考えではなく、Microsoft はおそらく意図的にこのプロパティを省略しました。

これは、他の多くのリスト コントロールと同様に、DataGrid が UI 仮想化を使用するためです。つまり、とにかく VISIBLE 行の DataGridRow アイテムのみを生成するためです。すべての行を列挙できると、この機能の目的が無効になり、メモリが不必要に消費されます。

多くの人が言及しているように (私は同意しません)、最終的に最善の方法は、MS が意図した方法でグリッドを使用することです。

ただし、実際の DataGridRow オブジェクトにアクセスできる、私が望んでいたものに近いものを見つけました。

myDataGridInstance.ItemContainerGenerator.ContainerFromItem()

または

myDataGridInstance.ItemContainerGenerator.ContainerFromIndex()

どちらのメソッドも、指定されたコレクション オブジェクトに対応する DataGridRow を提供します。その後、他の通常の要素と同様に、そのビジュアル ツリーとプロパティを分析してナビゲートできます (たとえば、独自の DataContext がコレクション アイテム インスタンスになります)。

すべての CheckBox ティックを追跡するために見つけた別の方法は、Control.Tag プロパティを介して基になるオブジェクト バインディングを関連付けることでした。これを {Binding} に設定します。特定のプロパティ ... CheckBox のイベント ハンドラーで、チェックされている/チェックされていない項目のリストを手動で追跡できます。

それを行うのは間違いなく賢明な方法ではありません-しかし、それは可能であり、それが私が探していたものでした-そうは言っても、MSが意図した方法で物事を行うことに戻ります:)

于 2012-08-19T20:59:14.753 に答える