2013-02-25 70 views
3

的第一列的行數在尋找我發現,行號可以很容易地設置的rowHeader:如何顯示在WPF Datagrid的

void datagrid_LoadingRow(object sender, DataGridRowEventArgs e) 
{ 
    e.Row.Header = e.Row.GetIndex(); 
} 

它集的rowHeader行號。但是我想表明的行號到第一列

任何一個可以幫助我,我怎麼能做到這一點?由於

+0

我嘗試使用, 空隙datagrid_LoadingRow(對象發件人,DataGridRowEventArgs E) { e.Row.Header = e.Row.GetIndex(); } 它集的rowHeader行號,我需要在列設置。 – Hardik 2013-02-25 06:34:42

回答

12

有可能做到這一點更簡單的方法,但我把它用在DataGridRow類GetIndex()方法來工作。這會將索引返回到數據源,因此可能並不完全是您要的。

enter image description here

的XAML

<Window x:Class="WpfApplication1.MainWindow" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:sys="clr-namespace:System;assembly=mscorlib" 
      xmlns:local="clr-namespace:WpfApplication1" 
      Title="MainWindow" Height="350" Width="525"> 
     <DataGrid> 
      <DataGrid.Columns> 
       <DataGridTextColumn Binding="{Binding RelativeSource={RelativeSource AncestorType=DataGridRow}, Converter={local:RowToIndexConverter}}" /> 
      </DataGrid.Columns> 
      <DataGrid.Items> 
       <sys:String>a</sys:String> 
       <sys:String>b</sys:String> 
       <sys:String>c</sys:String> 
       <sys:String>d</sys:String> 
       <sys:String>e</sys:String> 
      </DataGrid.Items> 
     </DataGrid> 
    </Window> 

和轉換器。

public class RowToIndexConverter : MarkupExtension, IValueConverter 
{ 
    static RowToIndexConverter converter; 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     DataGridRow row = value as DataGridRow; 
     if (row != null) 
      return row.GetIndex(); 
     else 
      return -1; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     if (converter == null) converter = new RowToIndexConverter(); 
     return converter; 
    } 

    public RowToIndexConverter() 
    { 
    } 
} 
+2

感謝安迪,它的工作。只是一個垃圾編輯,row.GetIndex()+ 1. – Hardik 2013-02-25 07:13:47

+0

不錯的一個,雖然對我來說,它在設計時間太多了一行。我的itemssource中有三個項目,但我在網格中獲得四行,最後一個索引爲4,所有列都爲空。 – Pompair 2013-10-23 12:33:16

+2

當有許多行並啓用行虛擬化時,它不起作用。 – Gildor 2013-12-20 15:30:24

0

我用Andys例子,但我需要從後面的代碼中使用它,所以他是我的代碼,以防萬一有人正在做同樣的google搜索有點荒蕪。

的C#

DataGrid dataGrid = new DataGrid(); 

    DataGridTextColumn column0 = new DataGridTextColumn(); 
    column0.Header = "#"; 

    Binding bindingColumn0 = new Binding(); 
    bindingColumn0.RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(DataGridRow), 1); 
    bindingColumn0.Converter = new RowToIndexConvertor(); 

    column0.Binding = bindingColumn0; 

    dataGrid.Columns.Add(column0); 

安迪的轉換器,只是增加return row.GetIndex() - 1;從1開始計數,而不是0

public class RowToIndexConvertor : MarkupExtension, IValueConverter 
{ 
    static RowToIndexConvertor convertor; 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     DataGridRow row = value as DataGridRow; 

     if (row != null) 
     { 
      return row.GetIndex() + 1; 
     } 
     else 
     { 
      return -1; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     if (convertor == null) 
     { 
      convertor = new RowToIndexConvertor(); 
     } 

     return convertor; 
    } 


    public RowToIndexConvertor() 
    { 

    } 
} 

另外不要忘了使用的

using System; 
using System.Windows.Data; 
using System.Windows.Controls; 
using System.Windows.Markup;