닷넷/WPF

C# WPF DataGrid에 Row번호 출력 되는 칼럼 추가하기 (닷넷프레임워크 .net framework 4.0 기준)

FreeBear 2023. 8. 10. 14:58
반응형

닷넷5.0 이상 기준으로는 

https://kaki104.tistory.com/808

 

DataGrid에 Row번호를 출력하기

별도의 3rd party 컨트롤을 사용하지 않는 경우 DataGrid를 많이 사용하는데, RowNumber를 출력하는 방법을 찾아보니 MVVM pattern에서 사용하기 쉬운 방법에 대해서 설명되어 있는 것이 없는 것 같아서 간

kaki104.tistory.com

이 글을 참고 하면 되지만, 닷넷프레임워크 4.0에서는 Microsoft.Xaml.Behaviors.Wpf 1.1.39를 설치할 수 없기 때문에 다음의 두 가지 방법이 있습니다.

 

비하인드 코드에서

/// <summary>
/// ListDetail.xaml에 대한 상호 작용 논리
/// </summary>


private void Loaded(object sender, RoutedEventArgs e)
{
    AddNumberColumn(gridDataDetail);
}

private void AddNumberColumn(DataGrid dataGrid)
{
    DataGridTextColumn numberColumn = new DataGridTextColumn
    {
        Header = "#",
        Width = 40
    };

    numberColumn.Binding = new System.Windows.Data.Binding
    {
        Path = new PropertyPath("Items.IndexOf(Item)"),
        RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(DataGrid), 1)
    };

    dataGrid.Columns.Insert(0, numberColumn);
}

 

코드 설명

이 코드는 .NET Framework 4.0에서 WPF (Windows Presentation Foundation)의 DataGrid 컨트롤에 행 번호 열을 추가하는 예제입니다. DataGrid는 테이블 형식의 데이터를 표시하는 데 사용되는 컨트롤입니다.

using System.Windows.Controls;: System.Windows.Controls 네임스페이스에 있는 클래스를 사용하기 위해 네임스페이스를 임포트합니다.

namespace DataGridNumberColumn: DataGridNumberColumn 네임스페이스를 정의합니다.

public class DataGridNumberColumn: DataGridNumberColumn 클래스를 정의합니다.

public static void AddNumberColumn(DataGrid dataGrid): AddNumberColumn 메서드를 정의합니다. 이 메서드는 DataGrid에 행 번호 열을 추가하는 역할을 합니다. 메서드는 DataGrid를 파라미터로 받습니다.

DataGridTextColumn numberColumn = new DataGridTextColumn: DataGridTextColumn 객체인 numberColumn을 생성합니다. 이 객체는 텍스트 기반의 열을 나타냅니다.

Header = "#": numberColumn의 헤더 (열 제목)를 "#"로 설정합니다.

Width = 40: numberColumn의 너비를 40으로 설정합니다.

numberColumn.Binding = new System.Windows.Data.Binding: numberColumn의 Binding을 설정합니다. 이를 통해 해당 열의 데이터 바인딩을 정의할 수 있습니다.

Path = new PropertyPath("Items.IndexOf(Item)"): 바인딩 경로를 설정합니다. "Items"는 DataGrid의 항목 컬렉션을 나타내며, "IndexOf(Item)"은 항목의 인덱스를 가져오는 것을 의미합니다.

RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(DataGrid), 1): 바인딩의 상대 소스를 설정합니다. 여기서는 DataGrid를 찾는 조상 요소를 찾습니다. "1"은 DataGrid로부터 한 단계 위 조상을 찾도록 설정합니다.

dataGrid.Columns.Insert(0, numberColumn);: dataGrid의 Columns 컬렉션에 numberColumn을 첫 번째 열로 삽입합니다. 이렇게 하면 DataGrid에 행 번호 열이 추가됩니다.

 

xaml에서

<DataGrid x:Name="gridDataDetail" AutoGenerateColumns="True">
    <!-- 행 헤더를 정의 -->
    <DataGrid.RowHeaderTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}}, Path=DataContext.RowNumber}" />
        </DataTemplate>
    </DataGrid.RowHeaderTemplate>
</DataGrid>

위의 예시는 DataGrid.RowHeaderTemplate를 사용하여 행 헤더를 커스텀하게 정의하고, 텍스트 블록을 이용하여 행 번호를 표시하도록 설정합니다.

반응형