2017-02-18 68 views
0

我試過不同的事情,我想知道如何將行計數器添加到數據網格的左側? (就像我們看到在Excel)WPF數據網格,如何創建「左側」標題?

我看到它的可能:

enter image description here

但我不知道如何實現這一目標。我承認我是一個新手當談到WPF,但在對象屬性中沒有「複選框」來激活它,到目前爲止我沒有遇到任何明確的代碼,所以我不知道它,所以我不知道如果它簡單,或者一些精心的破解。

ty。

+0

好吧,這並不簡單,但它也不完全是黑客。這或多或少會成爲您必須制定的自定義控件。我不認爲你應該擔心,直到你在WPF中擁有更強的基礎。 (說起剛剛從winforms轉換到WPF的人)。 –

+0

謝謝。我將處理我的WPF基礎知識。我希望這是一個「複選框」的東西,而不是製作我自己的自定義控件。 –

回答

1

關於如何在以下鏈接上提供的完整代碼示例可用。

添加右對齊行號在WPF一個DataGridRowHeader:https://blog.magnusmontin.net/2014/08/18/right-aligned-row-numbers-datagridrowheader-wpf/

你可以把一個TextBlockDataGridRowHeaderTemplate和使用轉換器來獲得該行的索引:

<DataGrid ItemsSource="{Binding Countries}" AutoGenerateColumns="False" 
    xmlns:local="clr-namespace:Mm.WpfApplication1"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Country" Binding="{Binding Name}"/> 
    </DataGrid.Columns> 
    <DataGrid.Resources> 
     <local:RowNumberConverter x:Key="converter"/> 
    </DataGrid.Resources> 
    <DataGrid.RowHeaderTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Path=., 
         RelativeSource={RelativeSource AncestorType=DataGridRow}, 
         Converter={StaticResource converter}}"></TextBlock> 
     </DataTemplate> 
    </DataGrid.RowHeaderTemplate> 
    <DataGrid.RowHeaderStyle> 
     ... 
    </DataGrid.RowHeaderStyle> 
</DataGrid> 

但是這種方法只會在虛擬化被禁用或者您的ItemsSource中只有幾行時才起作用。如果要正確顯示行號但仍保留DataGrid的默認虛擬化和回收行爲,則可以處理DataGridLoadingRow事件,以將DataGridRowHeader屬性設置爲行號,然後綁定到此屬性RowHeaderTemplate

還要注意的是,如果DataGrid綁定到ObservableCollection<T>和您添加或在運行時動態從中刪除項目/,行號要等到你開始滾動和更新LoadingRow事件再次發射。

爲了解決這個問題,你可以掛鉤的事件處理程序ItemsChanged事件在視圖中DataGridItemContainerGenerator和重置所有DataGridRow元素是目前在可視化樹在該事件發生的Header財產。

請參考上面的鏈接瞭解更多信息和完整的工作示例。

+0

謝謝。棒極了。 –

1

使用數據表來佔滿DataGrid,然後使用

主窗口

public MainWindow() 
    { 
     InitializeComponent(); 
        DataTable tab = new DataTable(); 
     for (int i = 0; i < 10; i++) 
      tab.Columns.Add("col " + i.ToString()); 
     for (int i = 0; i < 1000; i++) 
     { 
      DataRow r = tab.NewRow(); 
      for (int j = 0; j < 10; j++) 
       r[j] = "row " + (i).ToString() + "-col " + (j).ToString(); 
      tab.Rows.Add(r); 
     } 
     dg.ItemsSource = tab.AsDataView(); 
    } 

的XAML

<Window.Resources> 
    <local:HeaderConverter x:Key="headerConverter"/> 
</Window.Resources> 

<Grid> 
    <DataGrid Name="dg"> 
     <DataGrid.RowHeaderTemplate> 
      <DataTemplate> 
       <TextBlock MinWidth="30" TextAlignment="Center"> 
        <TextBlock.Text> 
         <MultiBinding Converter="{StaticResource headerConverter}"> 
          <Binding Path="ItemsSource" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=DataGrid}" /> 
          <Binding Path="Item" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=DataGridRow}"/> 
         </MultiBinding> 
        </TextBlock.Text> 
       </TextBlock> 
      </DataTemplate> 
     </DataGrid.RowHeaderTemplate> 
    </DataGrid> 
</Grid> 

轉換

public class HeaderConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     int ind = -1; 
     DataView dv = values[0] as DataView; 
     if (dv != null) 
     { 
      DataRowView drv = values[1] as DataRowView; 
      ind = dv.Table.Rows.IndexOf(drv.Row); 
     } 
     else 
     { 
      System.Collections.IEnumerable ien = values[0] as System.Collections.IEnumerable; 
      ind = IndexOf(ien, values[1]); 
     } 
     if (ind == -1) 
      return ""; 
     else 
      return (ind + 1).ToString(); 
    } 
    static int IndexOf(System.Collections.IEnumerable source, object value) 
    { 
     int index = 0; 
     foreach (var item in source) 
     { 
      if (item.Equals(value)) 
       return index; 
      index++; 
     } 
     return -1; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

'RowHeaderTemplate'是這樣做的正確方法,但如果DataGrid綁定到[* CollectionViewSource *](https://msdn.microsoft.com/zh-cn/library/ff407126( v = vs.110).aspx) – slugster

+0

感謝您的意見。這是一個簡單的例子,我更新了答案。 – Ron

+0

@Lucano Deskovic:請注意,Converter的IEnumerable部分也可以處理DataTable,但它不會將索引保留在排序中。這就是爲什麼我用if分隔那部分。 – Ron

相關問題