2013-03-27 56 views
6

Tất cả, tôi đang cố gắng lặp qua một WPF DataGrid sử dụng một cho mỗi vòng lặp để thay đổi màu nền của các ô sai. Tôi đã kiểm tra nhiều câu hỏi nhưng tôi vẫn chưa tìm được câu trả lời đầy đủ. Những gì tôi có cho đến nay làLooping Thông qua WPF DataGrid Sử dụng foreach

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! 
      } 
     } 
    } 
} 

Vấn đề là để thay đổi Background màu sắc của một hàng trong DataGrid của tôi, tôi cần phải làm việc với các đối tượng DataGridRow ascociated với DataRowViewrv.

Tôi làm cách nào để tham chiếu đến DataGridRow từ đối tượng rv (DataRowView)?

Cảm ơn thời gian của bạn.

Chỉnh sửa. Dựa trên những lời khuyên dưới đây tôi bây giờ có phong cách sau đó làm việc với chuột trên sự kiện và thiết lập lại và fore font của tế bào có liên quan. Tuy nhiên, tôi thực sự bị mất như thế nào để áp dụng backcolor cho một tế bào tại thời gian chạy trong mã của tôi ở trên. Phong cách XML là

<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> 

Trả lời

5

Khi bạn đang làm việc với WPF, tránh luôn truy cập hiện vật UI trực tiếp.

Tạo trong bạn Mô hìnhXem một thuộc tính Màu và gắn nó với màu nền của một mẫu hàng đơn của chế độ xem DataGrid của bạn.

Vì vậy, để thay đổi màu bạn sẽ lặp lại, hãy ném bộ sưu tập ModelView và thiết lập/đọc thuộc tính Màu của mỗi đối tượng được liên kết với mỗi hàng. Bằng cách thay đổi nó, nếu ràng buộc được định vị chính xác, bạn sẽ ảnh hưởng đến giao diện màu của giao diện người dùng.

Đối với mẫu bê tông bạn có thể nhìn vào:

How do I bind the background of a data grid row to specific color?

+0

Cảm ơn thời gian của bạn. Tôi sẽ đưa ra lời khuyên của bạn và bắt đầu đọc. Tôi cũng đã cố gắng tô màu và toàn bộ cột, một lần nữa không có may mắn. Tôi đã hỏi một câu hỏi khác [ở đây] (http://stackoverflow.com/questions/15644105/change-the-background-color-of-entire-column-of-wpf-datagrid-at-runtime) nếu bạn có thể được borhered và muốn đại diện. Cảm ơn một lần nữa ... – MoonKnight

+0

@Killercam: ý tưởng là như nhau cho các hàng và cột. Nếu đối tượng UI chứng minh một số thuộc tính (màu trong trường hợp này) có thể được thay đổi hoặc bằng truy cập trực tiếp hoặc thông qua ràng buộc, bạn sử dụng ràng buộc từ đối tượng modelview của bạn. – Tigran

+0

Cảm ơn. Đã đọc một chương tắt một cuốn sách về Styles, Triggers, vv Tôi đã có hàng thay đổi màu sắc trên một con chuột trên sự kiện. Tuy nhiên, tôi bị mất như thế nào để thay đổi một tế bào/hàng để màu sắc yêu cầu từ mã tại thời gian chạy bằng cách sử dụng các phong cách. nếu bạn có thể cung cấp bất kỳ trợ giúp ở đây nó sẽ được đánh giá cao nhất ... Tôi đã chỉnh sửa các câu hỏi để hiển thị phong cách tôi có. – MoonKnight

2

Bạn có thể sử dụng ItemContainerGenerator để có được những hình ảnh đại diện cho dữ liệu của bạn tức là DataGridRow -

DataGridRow row = (DataGridRow)dataGrid.ItemContainerGenerator 
             .ContainerFromItem(rv); 
+0

Điều này trả về 'null' cho' hàng'. Tôi đã kiểm tra 'rv' và điều này là không null. Xin lỗi vì đã làm phiền bạn lần nữa, nhờ thời gian của bạn ... – MoonKnight

+0

Điều này sẽ trả về 'null' chỉ trong trường hợp hàng không được hiển thị trên GUI của bạn. Bạn đang xử lý bao nhiêu hàng và bật 'ảo hóa' trên mạng của mình? –

+0

Liên kết tại đây - http://stackoverflow.com/questions/6713365/itemcontainergenerator-containerfromitem-returns-null có thể là sự giúp đỡ của bạn. –

0

Sau nhiều đọc tôi đã tìm thấy một cách để làm những gì tôi muốn - các ô màu tại thời gian chạy tùy thuộc vào các điều kiện nhất định. Đây là phương pháp tôi sử dụng để làm màu

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); 
      } 
     } 
    } 
} 

Đây là những phương pháp hữu ích liên quan đến yêu cầu

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; 
    } 
} 

Lưu ý tuy nhiên, màu sắc của các tế bào di chuyển từ tế bào này sang tế bào khi người dùng cuộn! ? Đây là một phiền toái tuyệt vời khác của WPF. Tôi thực sự bối rối về lý do tại sao một cái gì đó đơn giản này có thể được thực hiện rất khó khăn. Đề xuất chúng tôi cần sử dụng mẫu kiểu MVVM cho loại điều tôi thấy tuyệt vời ...

Tôi hy vọng điều này sẽ giúp người khác.

1

câu trả lời của "Killercam" làm việc cho tôi, nhưng tôi cần thêm:

myDataGrid.UpdateLayout();

trước khi sử dụng các phương pháp GetCell vì vậy tôi chắc chắn rằng tôi không nhận được một tham chiếu null.

để có được cái nhìn hoàn toàn lớp Helper tại DataGridHelper

sau khi tất cả nỗi đau đó, tôi cố gắng toàn bộ mã và tôi phải đối mặt với một probem mà là rằng các tế bào màu một cách chính xác thay đổi trong một cuộn giấy, giải pháp là để cho phép ảo hóa và đặt chế độ của nó thành Chuẩn.

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

vì vậy, hy vọng điều này sẽ giúp bất kỳ ai cần lặp lại thông qua các ô dữ liệu.

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 
+0

Điều này không cung cấp câu trả lời cho câu hỏi. Khi bạn có đủ [danh tiếng] (https://stackoverflow.com/help/whats-reputation), bạn sẽ có thể [nhận xét về bất kỳ bài đăng nào] (https://stackoverflow.com/help/privileges/comment); thay vào đó, [cung cấp câu trả lời không yêu cầu làm rõ từ người hỏi] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-thay thế). - [Từ đánh giá] (/ đánh giá/bài đăng chất lượng thấp/17321773) –