SIGN UP MEMBER LOGIN:    
ARTICLE

GridView in WPF

Posted by Mahesh Chand Articles | WPF November 09, 2009
If you are looking for a GridView control in WPF, you will be disappointed. WPF does not have a GridView control. But the good news is you can achieve a GridView like functionality with a ListView control available in WPF. This article demonstrates how to generate a GridView like ListView control in WPF.
Reader Level:
Download Files:
 

If you are looking for a GridView control in WPF, you will be disappointed. WPF does not have a GridView control. But the good news is you can achieve GridView like functionality with a ListView control available in WPF.

If you have not used a ListView control in WPF, I recommend you read my ListView in WPF article before this article.

The View property is used to provide a GridView layout and design in a ListView control. The View property of ListView is a type of ViewBase class that supports two view types - GridView and a custom view.  A GridView is used for arranging data in columns and adding layout and design support to a ListView.

The following code snippet sets the View property of a ListView to GridView mode.

<ListView>

    <ListView.View>

        <GridView />

     </ListView.View>

</ListView>

A GridView is used as a supplement control to a ListView to provide style and layout. The GridView does not have its own control related properties such as background and foreground colors, font properties, size, and location. The container ListView is used to provide all control related properties.

Creating a GridView

The GridView element in XAML represents a GridView at design-time. The Columns property of GridView returns a collection of GridViewColumn objects. GridViewColumn element in XAML represents a GridView column. AllowsColumnReorder property represents weather columns in a GridView can be reordered by a user by dragging and dropping from one position to another. ColumnHeaderToolTip property represents the content of a tooltip that appears when the mouse pointer pauses over one of the column headers.

The code listed in Listing 1 creates a GridView control and adds four columns to it. The Header property of GridViewColumn represents the header of a column. The Width property represents the width of a column and the DisplayMemberBinding property is used to bind a GridViewColumn to a property of data binding object.

<GridView AllowsColumnReorder="true" ColumnHeaderToolTip="Authors"

          >

<GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Path=Name}" />

    <GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Path=Age}" />

    <GridViewColumn Header="Book" Width="250" DisplayMemberBinding="{Binding Path=Book}" />

    <GridViewColumn Header="MVP" Width="50" DisplayMemberBinding="{Binding Path=Mvp}" />

   

</GridView>

Listing 1

The output of listing looks like Figure 1.

GridViewImg1.gif

Figure 1

The GridCiew class in WPF represents a GridView control. The GridViewColumn class represents a GridView column. The code listed in Listing 2 creates a GridView control and adds four columns to it dynamically.

private void CreateDynamicGridView()

{

    // Create a GridView 

    GridView grdView = new GridView();

    grdView.AllowsColumnReorder = true;

    grdView.ColumnHeaderToolTip = "Authors";

 

    GridViewColumn nameColumn = new GridViewColumn();

    nameColumn.DisplayMemberBinding = new Binding("Name");

    nameColumn.Header = "Author Name";

    nameColumn.Width = 120;

    grdView.Columns.Add(nameColumn);

 

    GridViewColumn ageColumn = new GridViewColumn();

    ageColumn.DisplayMemberBinding = new Binding("Age");

    ageColumn.Header = "Age";

    ageColumn.Width = 30;

    grdView.Columns.Add(ageColumn);

 

    GridViewColumn bookColumn = new GridViewColumn();

    bookColumn.DisplayMemberBinding = new Binding("Book");

    bookColumn.Header = "Book";

    bookColumn.Width = 250;

    grdView.Columns.Add(bookColumn);

 

    GridViewColumn mvpColumn = new GridViewColumn();

    mvpColumn.DisplayMemberBinding = new Binding("Mvp");

    mvpColumn.Header = "Mvp";

    mvpColumn.Width = 50;

    grdView.Columns.Add(mvpColumn);

 

    ListView1.View = grdView;

}

Listing 2

Adding a ContextMenu to a GridView Header

The ColumnHeaderContextMenu property of GridView is used to gets or sets a ContextMenu when you click on the header of a GridView control. The code snippet listed in Listing 3 adds a ContextMenu to a GridView header.

<GridView AllowsColumnReorder="true" ColumnHeaderToolTip="Authors">

   

    <!-- Add a ContextMenu to GridView Header -->

    <GridView.ColumnHeaderContextMenu>

        <ContextMenu >

            <MenuItem Header="Ascending" Click="MenuItem_Click" />

            <MenuItem Header="Descending" />

        </ContextMenu>

    </GridView.ColumnHeaderContextMenu>                 

    <!-- Add GridVeiw Columns -->                   

    <GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Path=Name}" />

    <GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Path=Age}" />

    <GridViewColumn Header="Book" Width="250" DisplayMemberBinding="{Binding Path=Book}" />

    <GridViewColumn Header="MVP" Width="50" DisplayMemberBinding="{Binding Path=Mvp}" />

   

</GridView>

Listing 3

The output of listing looks like Figure2.

GridViewImg2.gif

Figure 2

Adding a CheckBox to a GridView Header

The ColumnHeaderTemplate property represents the template for the column header. Using this property, you may format GridView column headers the way you want. You may add CheckBoxes or Images to the column headers.

The code snippet in Listing 4 creates a DataTemplate resource with a CheckBox and orange foreground color of text that we can set as ColumnHeaderTemplate of a GridView.

<Window.Resources>       

    <DataTemplate x:Key="OrangeHeaderTemplate">

        <DockPanel>

            <CheckBox/>

            <TextBlock FontSize="10" Foreground="Orange"

                       FontWeight="Bold" >

      <TextBlock.Text>

        <Binding/>

      </TextBlock.Text>

            </TextBlock>

        </DockPanel>

    </DataTemplate>       

   

</Window.Resources>

Listing 4

The code snippet in Listing 5 sets the ColumnHeaderTemplate of a GridView.

<GridView AllowsColumnReorder="true" ColumnHeaderToolTip="Authors"

          ColumnHeaderTemplate="{StaticResource OrangeHeaderTemplate}" >

Listing 5

The output of listing looks like Figure 3.

GridViewImg3.gif

Figure 3

Summary

This article was an introduction of using a GridView in WPF. I will be discussing more GridView related functionality in my forthcoming articles.

share this article :
post comment
 

Thanks for this article. Its solved my half of the problem.... Thank you very much.

Posted by ujwal khairnar Oct 18, 2011

Hello, I am trying to put dataGrid(Gridview) in vertical order. This datagrid works similar to data entry form but user will be editing data instead of entering new one. user should be able to borwse/edit using pagination, so we need to display one dataset at a time. I must be able to create DataGrid dynamically since column name (e.g. FirstName, LastName...250+ columns, is stored in database table). Each column's value could be edited differently. For example if column-name is Age then user should be able to pick some age from Drop down box. See example below. FristName | Steve LastName | Ronald Age | 25 ==> DropDownbox with value from 1- 100 Sex | Male ==> DropDownbox with value of Male and Female Employed | Yes ==> check box and so on Any help is highly appreciated

Posted by Shai Bazz May 23, 2011

you have qouted this example by binding the gridview to specific examples like name ,,,,how to do it without binding ?..the header and entries should be displayed dynammically based on the requirement.i hope you are getting my point example: if my query is select name the result should be only one column as name wit entries below it if my query is select name,id the result should be 2 columns and so on please help !!!!

Posted by shriram iyer Apr 09, 2011

Hi Mahesh, In your MenuItem_Click event method, how do you know the column on which event is fired ? Thanks Vince

Posted by Vincent Mar 30, 2011

thanks for this

Posted by Mojalefa Rafube Jan 07, 2011
6 Months Free & No Setup Fees ASP.NET Hosting!
Become a Sponsor
PREMIUM SPONSORS
  • ceTE software specializes in components for dynamic PDF generation and manipulation. The DynamicPDF™ product line allows you to dynamically generate PDF documents, merge PDF documents and new content to existing PDF documents from within your applications.
    Finally – a virtual platform that delivers next-generation Windows Server 2008 Hyper-V virtualization technology from a managed hosting partner you can truly depend on. Visit www.maximumasp.com/max for a FREE 30 day trial. Hurry offer ends soon. Climb aboard the MaxV platform and take advantage of High Availability, Intelligent Monitoring, Recurrent Backups, and Scalability – with no hassle or hidden fees. As a managed hosting partner focused solely on Microsoft technologies since 2000, MaximumASP is uniquely qualified to provide the superior support that our business is built on. Unparalleled expertise with Microsoft technologies lead to working directly with Microsoft as first to offer IIS 7 and SQL 2008 betas in a hosted environment; partnering in the Go Live Program for Hyper-V; and product co-launches built on WS 2008 with Hyper-V technology.
Team Foundation Server Hosting
Become a Sponsor