views:

1973

answers:

3

I am populating a DataGridView control on a Windows Form (C# 2.0 not WPF).

My goal is to display a grid that neatly fills all available width with cells - i.e. no unused (dark grey) areas down the right and sizes each column appropriately according to the data it contains, but also allows the user to resize any of the columns to their liking.

I am attempting to achieve this by setting the AutoSizeMode of each column to be DataGridViewAutoSizeColumnMode.AllCells except for one of the columns which I set to DataGridViewAutoSizeColumnMode.Fill in order to ensure the entire area of the grid is neatly filled with data. (I don't mind that when the user attempt to resize this column it springs back to a size that ensures the horizontal space is always used.)

However, as I mentioned, once loaded I would like to allow the user to resize the columns to suit their own requirements - in setting these AutoSizeMode values for each column it appears the user is then unable to then resize those columns.

I've tried not setting the AutoSizeMode of all the columns which does allow resizing BUT doesn't set the initial size according to the data the cells contain. The same result occurs when changing the grid's AutoSizeMode back to "Not Set" after loading the data.

Is there a setting I'm missing here which allows automatic setting of default column widths AND user resizing or is there another technique I must use when populating the DataGridView control?

A: 

In my application i set the AutoSizeColumnsMode to DataGridViewAutoSizeColumnMode.Fill and the AutoSizeRowsMode to DataGridViewAutoSizeRowsMode.None.

Also, i set the AllowUserToOrderColumns and AllowUserToResizeColumns to 'true'.

Now the column widths can be changed and the columns can be rearranged by the user. That works pretty well for me.

Maybe that will work for you.

Jehof
Setting the grid's AutoSizeColumnsMode to "Fill" seems to set all columns to the same widths. Yes the columns are then resizable but the initial widths are all wrong. I may need to set the column widths in code "manually".
Stuart Helwig
+4  A: 

This trick works for me:

    grd.DataSource = DT

    'set autosize mode
    grd.Columns(0).AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
    grd.Columns(1).AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
    grd.Columns(2).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill

    'datagrid has calculated it's widths so we can store them
    For i = 0 To grd.Columns.Count - 1
        'store autosized widths
        Dim colw As Integer = grd.Columns(i).Width
        'remove autosizing
        grd.Columns(i).AutoSizeMode = DataGridViewAutoSizeColumnMode.None
        'set width to calculated by autosize
        grd.Columns(i).Width = colw
    Next

What happens here is that you set autosize to whathever mode you need and then column by column you store the width it got from autosize calculation, remove autosizing and set width to value you stored before.

Hugo Riley
You know, for a VB programmer, that's good stuff! I gave a +1!
jp2code
+2  A: 

Maybe you could call

dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.Fill);

After setting datasource.It will set the width and allow resize.

http://msdn.microsoft.com/en-us/library/ms158594.aspx

Umair