6

すべて、for eachループを使用してWPFをループし、エラーDataGridのあるセルの背景色を変更しようとしています。多くの質問をチェックしましたが、まだ十分な答えが見つかりません。私が今まで持っているのは

public void RunChecks()
{
    const int baseColumnCount = 3;
    foreach (DataRowView rv in dataGrid.Items)
    {
        for (int i = baseColumnCount; i < dataGrid.Columns.Count; i++)
        {
            if (!CheckForBalancedParentheses(rv.Row[i].ToString()))
            {
                Color color = (Color)ColorConverter.ConvertFromString("#FF0000");
                row.Background = new SolidColorBrush(color); // Problem!
            }
        }
    }
}

問題はBackground、私の行の色を変更するために、に関連付けられたオブジェクトを操作DataGridする必要があることです。DataGridRowDataRowView rv

DataGridRowオブジェクトrv( )からへの参照を取得するにはどうすればよいDataRowViewですか?

御時間ありがとうございます。

編集。以下のアドバイスに基づいて、マウスオーバーイベントで機能し、関連するセルの前後のフォントを設定する次のスタイルがあります。ただし、上記のコードでは、実行時にセルにバックカラーを適用する方法については本当に迷っています。XMLスタイルは

<Window.Resources>
    <Style TargetType="{x:Type DataGridRow}">
        <Style.Triggers>
            <Trigger Property="IsMouseOver"
                     Value="True">
                <Setter Property="Background" Value="Red" />
                <Setter Property="FontWeight" Value="ExtraBold" />
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
4

5 に答える 5

5

WPFを使用している場合は、常にUIアーティファクトに直接アクセスすることは避けてください。

ModelViewにプロパティColorを作成し、それをDataGridビューの単一行テンプレートの背景色にバインドします。

したがって、色を変更するには、ModelViewコレクションをループスローし、すべての行にバインドされているすべてのオブジェクトのColorプロパティを設定/読み取ります。これを変更することにより、バインディングが正しく設定されている場合、行UIの色の外観に影響します。

具体的なサンプルについては、以下を参照してください。

データグリッド行の背景を特定の色にバインドするにはどうすればよいですか?

于 2013-03-27T11:12:22.840 に答える
2

を使用しItemContainerGeneratorて、データの視覚的表現を取得できますDataGridRow

DataGridRow row = (DataGridRow)dataGrid.ItemContainerGenerator
                                       .ContainerFromItem(rv);
于 2013-03-27T11:12:23.597 に答える
1

「Kill​​ercam」の答えは私のために働いたが、私は追加する必要があった:

myDataGrid.UpdateLayout();

GetCellメソッドを使用する前に、null参照を取得していないことを確認します。

Helperクラス全体を取得するには、DataGridHelperを確認してください

すべての苦痛の後、私はコード全体を試してみましたが、スクロール中に正しく色付けされたセルが変更されたという別の問題に直面しました。解決策は、仮想化を有効にしてそのモードを標準に設定することでした。

VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Standard"

したがって、これがデータグリッドセルを反復処理する必要がある人に役立つことを願っています。

于 2013-09-23T10:58:08.917 に答える
0

多くの読書の後、私は自分がやりたいことをする方法を見つけました-特定の条件に応じて実行時にセルをカラーリングします。これは私が着色をするために使用する方法です

public void RunChecks()
{
    const int baseColumnCount = 3;
    for (int i = baseColumnCount; i < dataGrid.Columns.Count; i++)
    {
        foreach (DataGridRow row in Utilities.GetDataGridRows(dataGrid))
        {
            if (row != null)
            {
                DataGridCell cell = dataGrid.GetCell(row, i);

                // Start work with cell.
                Color color;
                TextBlock tb = cell.Content as TextBlock;
                string cellValue = tb.Text;
                if (!CheckForBalancedParentheses(cellValue))
                    color = (Color)ColorConverter.ConvertFromString("#FF0000");
                else
                    color = (Color)ColorConverter.ConvertFromString("#FFFFFF");
                row.Background = new SolidColorBrush(color);
                //cell.Background = new SolidColorBrush(color);
            }
        }
    }
}

これらは、必要な関連するユーティリティメソッドです

public static T GetVisualChild<T>(Visual parent) where T : Visual
{
    T child = default(T);
    int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
    for (int i = 0; i < numVisuals; i++)
    {
        Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
        child = v as T;
        if (child == null)
            child = GetVisualChild<T>(v);
        if (child != null)
            break;
    }
    return child;
}

public static DataGridCell GetCell(this DataGrid grid, DataGridRow row, int column)
{
    if (row != null)
    {
        DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row);
        if (presenter == null)
        {
            grid.ScrollIntoView(row, grid.Columns[column]);
            presenter = GetVisualChild<DataGridCellsPresenter>(row);
        }
        DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
        return cell;
    }
    return null;
}

public static IEnumerable<DataGridRow> GetDataGridRows(DataGrid grid)
{
    var itemsSource = grid.ItemsSource as IEnumerable;
    if (null == itemsSource) yield return null;
    foreach (var item in itemsSource)
    {
        var row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow;
        if (null != row) yield return row;
    }
}

ただし、ユーザーがスクロールすると、セルの色がセルからセルに移動することに注意してください!?これは、WPFのもう1つの驚くべき煩わしさです。なぜこんなに単純なものをこんなに難しくすることができるのか、私は本当に混乱しています。この種のことにはMVVMタイプのパターンを使用する必要があるという提案は私が素晴らしいと思います...

これが他の誰かに役立つことを願っています。

于 2013-03-27T14:20:15.637 に答える
0
//the Class that resembles the Datagrid Item schema

foreach (Class cl in dgDatagrid.Items)
   {
       MessageBox.Show(cl.ID.ToString());
   }

this is the most simplest way to read the datagrid data
most articles misguide such simple things
于 2017-09-13T15:14:20.593 に答える