5

WPF データグリッドで選択を操作したいのですが、実際のセルにアクセスしてフォーカスを設定し、選択済みとしてマークすることに問題があります。

  1. 誰でも説明できますか: **DatagridCellInfo** から **DatagridCell** を取得する簡単な方法がないのはなぜですか?
  2. SOでWPFデータグリッドを扱っている人がほとんどいないのはなぜですか? (投票数が多い Q/A はあまり見られません)
  3. WPF データグリッドの独自の選択モードを作成する簡単な方法はありますか?

私の問題は何ですか

Ctrlを押さずに複数のセルを(1つずつ)選択するときに、WPF Datagridでカスタム選択を行いたいと思いました。私はそれを非常にうまくやったが、選択したセルの1つを選択解除したいときに問題が発生している-単にクリックするだけである. リストから削除しても問題ありません。問題は、クリックするとフォーカスが当たってハイライトされ、選択された他のすべてのハイライトがオフになることです。選択されていない別のセルを選択すると、選択したすべてのセルが再び正しく強調表示されます。問題は選択解除だけです。

私のコード:

XAML:

<Window x:Class="SelectionTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style TargetType="DataGridCell">
            <EventSetter Event="PreviewMouseLeftButtonDown" Handler="DataGridCell_PreviewMouseLeftButtonDown"></EventSetter>
                                
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Background" Value="Pink"></Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
        <DataGrid 
            Name="mydatagrid"
            Width="Auto" Height="Auto"
            HeadersVisibility="All"
            AutoGenerateColumns="True" IsReadOnly="True"
            SelectionMode="Extended" SelectionUnit="Cell" 
            CanUserAddRows="False" CanUserDeleteRows="False"
            CanUserResizeColumns="False" CanUserResizeRows="False" 
            CanUserReorderColumns="False" CanUserSortColumns="False"
            SelectedCellsChanged="mydatagrid_SelectedCellsChanged"
            Padding="10" HorizontalAlignment="Center" VerticalAlignment="Top"
            >            
        </DataGrid>  
    </Grid>
</Window>

私が作成したいくつかのランダムなサンプル クラス オブジェクトのリストでデータグリッドを埋めました。

C#:

        private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            DataGridCell cell = sender as DataGridCell;
            
            DataGridCellInfo cellInfo = new DataGridCellInfo(cell);

            if ((cell.IsSelected)||(selectedList.Contains(cellInfo))||(selectedCellsList.Contains(cell)))
            {
                selectedList.Remove(cellInfo);
                selectedCellsList.Remove(cell);
                cell.IsSelected = false;
                mydatagrid.CurrentCell = selectedList[0];
            }
            else
            {

               if (selectedList.Count < 7)
               {
                   selectedList.Add(cellInfo);
                   selectedCellsList.Add(cell);
               }
               else
               {
                  selectedList.RemoveAt(0);
                  selectedList.Add(cellInfo);
                  selectedCellsList.RemoveAt(0);
                  selectedCellsList.Add(cell);
               }
            }
            
            mydatagrid.SelectedCells.Clear();
            mydatagrid.UnselectAll();

            foreach (DataGridCell xcell in selectedCellsList)
            {
                xcell.IsSelected = true;
                xcell.Focus();
            }
}

このコードが本当に醜いように見える場合は、申し訳ありません。しかし、私はまだ少しチャルパワンです。

ショートカットの問題は何ですか:選択したセルをクリックすると、そのセルだけがハイライトされてフォーカスされ、他のすべての選択されたセルがハイライトされます。これは、私がやりたいこととは正反対です。(まだ選択されていない他のセルをクリックすると、希望どおりに機能します。)

4

1 に答える 1