2013-05-09 26 views
6

OK, tôi đã tìm kiếm thời gian khá dài để giải quyết vấn đề này. Tôi đang phát triển hệ thống in đơn giản cho WPF DataGrids và đã quản lý để in bảng với vị trí ô đồng nhất bằng cách sử dụng DataTable và đặt nó làm ItemSource của DataGrid.Làm cho một số ô DataGrid trải rộng trên nhiều cột

Tuy nhiên, tôi cần một số hàng để chứa chỉ có một tế bào (bạn có thể nghĩ về nó như "tiêu đề nhóm hàng" bên trong bảng). Vì vậy, vì tôi đã không tìm thấy bất cứ điều gì về các tế bào của DataTable trải qua nhiều cột (nếu điều này có thể được thực hiện, nó sẽ là một điều tuyệt vời để biết làm thế nào), tôi figured tôi sẽ phải thêm hàng vào DataGrid bằng tay, và giải quyết nó một cái gì đó như thế này:

  • Hãy DataGrid mới với các cột mong muốn
  • Thêm hàng từng người một, thiết lập các DataGridCellPanel kéo dài hay không nhịp qua hàng

điểm thứ hai là nơi tôi có vấn đề (nếu đúng, đó là). Tôi cần phải thêm hàng vào một DataGrid sử dụng mảng đơn giản của các chuỗi dưới dạng dữ liệu ô (chỉ mục trong mảng sẽ lập chỉ mục ô). Có cách nào dễ dàng để làm điều gì đó như thế không?

+0

Dưới đây là cách tôi đã làm nó hoàn toàn trong XAML: http://stackoverflow.com/a/38687666/3360864 – Erik

Trả lời

4

Vì vậy, sau khi một số chi tiết không quan trọng với tất cả điều này, tôi đã đạt đến một giải pháp rất tốt đẹp.

Điều tốt nhất và dễ nhất cần làm là áp dụng mẫu dữ liệu cho các hàng cụ thể sau khi DataGrid được tải. Vì vậy, tôi bị mắc kẹt với ý tưởng ban đầu với DataTables và nhớ các chỉ số cần thiết để thay đổi mẫu của chúng. Tôi chỉ lấy DataGridRows từ các chỉ mục này và áp dụng mẫu có ItemPanelTemplate đã tùy chỉnh mở rộng ra nhiều cột.

EDIT: Theo yêu cầu của Daniel, tôi sẽ bao gồm một số mã.

Điều đầu tiên chúng ta cần là một khuôn mẫu để kéo dài hàng:

<ControlTemplate TargetType='{x:Type DataGridRow}' 
      xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' 
      xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' 
      > 
      <Border> 
       <DataGridCellsPresenter Foreground='Black'> 
        <DataGridCellsPresenter.ItemsPanel> 
         <ItemsPanelTemplate> 
          <local:DataGridSpannedCellPanel /> 
         </ItemsPanelTemplate> 
        </DataGridCellsPresenter.ItemsPanel> 
       </DataGridCellsPresenter> 
      </Border> 
     </ControlTemplate> 

LƯU Ý: địa phương: DataGridSpannedCellPanel là một DataGridCellsPanel tùy chỉnh với phương pháp ghi đè ArrangeOverride mà làm cho khoảng thời gian tế bào đầu tiên toàn bộ kích thước.

Bạn có thể tạo chuỗi ở phía sau mã và tải mẫu của bạn từ đó, ví dụ: Điều tiếp theo là tạo ra mạng lưới của bạn và khởi tạo một số các hàng với mẫu mới này:

var newGrid = MakeNewDataGrid(); 
newGrid.ItemsSource = myTable.AsDataView(); 
var template = XamlReader.Parse(HeaderRowTemplate) as ControlTemplate; 

foreach (int index in myHeaderIndices) 
        { 
         var container = newGrid.ItemContainerGenerator.ContainerFromIndex(index); 
         var row = container as DataGridRow; 
         if (row != null) 
         { 
          row.Template = template; 
         } 
        } 

Cũng lưu ý, hàng trong bảng của bạn cần phải được thực hiện như sau:

if (bindableQuote.IsGroup()) 
         { 

          table.Rows.Add("Header"); 
         } 
         else table.Rows.Add(rowData.ToArray()); 

Đó là về nó , điều duy nhất còn lại là tìm hiểu cách triển khai DataGridSpannedCellPanel.

+0

Bạn có thể cung cấp một ví dụ được gỡ xuống cho điều đó không? –

+0

Vui lòng xem câu trả lời đã chỉnh sửa. Tôi sẽ rất vui khi trả lời bất kỳ câu hỏi nào bạn có thể có. –

+0

@DejanMaksimovic: bạn có tìm ra cách để triển khai DataGridSpannedCellPanel không? Nếu có, bạn có thể đăng mã hoặc các phần quan trọng không? Cảm ơn. –

Các vấn đề liên quan