如何在C#中正确遍历DataGrid?

时间:2016-09-17 01:55:40

标签: c# wpf datagrid

我希望能够设置DataGrid行的背景。

我的第一个想法是这样做:

//MapDisplay is a DataGrid
SolidColorBrush myBrush = new SolidColorBrush(Colors.Red);
mapDisplay.RowBackground = myBrush;

现在,这可行,但它将为DataGrid中的每一行设置背景。 我的下一个想法是这样做:

SolidColorBrush myBrush = new SolidColorBrush(Colors.Red);
foreach (DataGridRow x in mapDisplay.Items)
{
    x.Background = myBrush;
}

然而,这并不会导致任何行'要改变的背景,所以我认为我做了一些根本错误的事情。如何正确遍历DataGrid的行以设置背景?

2 个答案:

答案 0 :(得分:0)

你的问题被标记为WPF,这是winforms答案......

DataGridView行使用行模板(DataGridViewCellStyle类)设置样式。

下面是一个用于将行添加到网格的拼接代码段组。 theGrid是我们添加行的控件。事件是从db返回的POCO。

                var rowCellStyle = new DataGridViewCellStyle(theMessagesGrid.DefaultCellStyle)
                {
                    BackColor = string.IsNullOrEmpty(conditions) 
                           ? theGrid.DefaultCellStyle.BackColor 
                           : theColor,
                    SelectionForeColor = Color.WhiteSmoke,
                    SelectionBackColor = theGrid.DefaultCellStyle.SelectionBackColor,
                };

            var theRow = new DataGridViewRow 
                { 
                   Height = theGrid.RowTemplate.Height, 
                   DefaultCellStyle = rowCellStyle, 
                   Tag = Event.GroupName 
                };

            theRow.CreateCells(theGrid);
            var cellData = new object[theRow.Cells.Count];

            // fill out cell data
            cellData[0] = ...;
            cellData[1] = ...
            theRow.SetValues(cellData);

            // add row to grid
            try
            {
                theGrid.Rows.Add(theRow);
                if (currentMsg == Event.Pkey) theGrid.Rows[theGrid.Rows.Count - 1].Selected = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, @"Error Building Grid", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                throw;
            }

WPF应该有某种样式应用于行。添加存储行模板的表单属性,然后根据条件更新rowCellStyle。

答案 1 :(得分:0)

要更改特定行的背景,需要根据其DataContext或其index的某个值获取该行。

然后将Trigger/DataTrigger应用于RowStyle

以编程方式,您可以使用以下内容DataGridRow获取Item

DataGridRow row = (DataGridRow) mapDisplay.ItemContainerGenerator.ContainerFromItem(item);

mapDisplay.Items会为您提供有限项目列表,这些项目可以是Map objects,也可以是Employee个对象。

ContainerFromIndex() method基于索引。

现在,修改代码,

   foreach (object o in mapDisplay.Items)
   {
        Map m = o as Map;
        if (m == null) break;

        if (m.AreaCode == 1234)
        {
            DataGridRow row = (DataGridRow)mapDisplay.ItemContainerGenerator.ContainerFromItem(m);
            row.Background = Brushes.Yellow;
        }
    }