Groups | Blog | Home
all groups > asp.net > august 2007 >

asp.net : Change order of columns in DataGrid dynamically


tshad
8/22/2007 7:48:39 PM
I am trying to allow my clients to specify the order that columns show in a
datagrid.

If I have a Datagrid like so:

<asp:DataGrid
Visible=true
AllowSorting="false"
AutoGenerateColumns="false"
CellPadding="0"
CellSpacing="0"
ID="DataGrid2"
runat="server"
ShowFooter="false"
ShowHeader="true"
OnSortCommand="SortDataGrid"
BorderWidth="0"
BorderColor="#999999"
Width="701px"
style="padding-right:5px">
<headerstyle Font-Bold="true" />
<alternatingitemstyle CssClass="alternateRows" />
<footerstyle BackColor="#E8EBFD" ForeColor="#3D3DB6" Font-Bold="true"
/>
<pagerstyle BackColor="white" />
<columns>
<asp:TemplateColumn sortexpression="JobTitle"
ItemStyle-Width="190px" HeaderStyle-Width="190px"
headertext="Job Title" ItemStyle-VerticalAlign="Top"
runat="server">
<ItemTemplate>
<asp:HyperLink ID="JobTitle"
NavigateURL='<%# "displayPositionNew.aspx?PositionID=" &
Container.DataItem("PositionID") %>'
Text='<%# Container.DataItem("JobTitle")%>'
OnPreRender="FixHyperLink"
runat="server"/>
</ItemTemplate>
</asp:TemplateColumn>
<asp:BoundColumn ItemStyle-Width="150" DataField="Company"
HeaderText="Company"
ReadOnly="true"
Visible="True"
ItemStyle-VerticalAlign="Top"
SortExpression="Company"/>
<asp:BoundColumn ItemStyle-Width="110" DataField="Location"
HeaderText="Location"
ReadOnly="true"
Visible="True"
ItemStyle-VerticalAlign="Top"
SortExpression="Location"/>
</columns>
</asp:DataGrid>

I have 3 columns: JobTitle, Company and Location - in that order.

But one client may want the client to be Company, Location, JobTitle and
another may want it to be Location, JobTitle,Company.

Is there a way to change the order of the columns as they are displayed?

I mentioned in another post that I change the size of the DataGrid and hide
columns in my PreRender event, like so:

DataGrid1.Width = new Unit("551px")
for each col as DataGridColumn in DataGrid1.Columns
if col.HeaderText = "Company" orElse col.HeaderText = "Posted" then
col.Visible = false
end if
next

Can I do something like this to also change the order in the table?

Thanks,

Tom

Eliyahu Goldin
8/23/2007 12:00:00 AM
You just need to operate on DataGrid.Columns collection in code-behind. Look
at the DataGridColumnCollection class, it has a few methods like AddAt that
can help you.

--
Eliyahu Goldin,
Software Developer
Microsoft MVP [ASP.NET]
http://msmvps.com/blogs/egoldin
http://usableasp.net


[quoted text, click to view]

tshad
8/23/2007 10:02:06 AM
"Eliyahu Goldin" <REMOVEALLCAPITALSeEgGoldDinN@mMvVpPsS.org> wrote in
message news:OKUutrV5HHA.4928@TK2MSFTNGP05.phx.gbl...
[quoted text, click to view]

I will look at that but I am not using code behind. I build all my pages in
DW and am using .net 1.1.

Also, AddAt or Insert is for creating new columns than adding them to the
DataGrid.

What I was hoping to do was to change the order of the columns already set
up in the DataGrid object below, either in the Page_Load or Page_PreRender
event. Since you can add a new column at the beginning of the column list
using AddAt or Insert (which would in effect change the order of the
columns) - is there a way to say move columns(2) to columns(1) some way?

Thanks,

Tom
[quoted text, click to view]

Eliyahu Goldin
8/26/2007 12:00:00 AM
[quoted text, click to view]

Make a copy of columns(2), remove columns(2) from the grid and add it again
with AddAt(0). This will move columns(2) to columns(1).

--
Eliyahu Goldin,
Software Developer
Microsoft MVP [ASP.NET]
http://msmvps.com/blogs/egoldin
http://usableasp.net


[quoted text, click to view]

tshad
8/28/2007 9:22:48 AM
"Eliyahu Goldin" <REMOVEALLCAPITALSeEgGoldDinN@mMvVpPsS.org> wrote in
message news:eMIqBw75HHA.5184@TK2MSFTNGP03.phx.gbl...
[quoted text, click to view]

That's sounds like a great idea.

I understand how AddAt works , but how do you copy one column and remove
another?

CopyAt will copy all the columns into an array (I think) - but I am not sure
how I delete the columns that add the array back into the array.

Also, I plan to do this in my Page_Load/"not IsPostback" event. Will this
change carry over to my next page or do I need to do it again at each
PostBack?

Thanks,

Tom
[quoted text, click to view]

tshad
8/28/2007 11:09:47 AM
"Eliyahu Goldin" <REMOVEALLCAPITALSeEgGoldDinN@mMvVpPsS.org> wrote in
message news:%23ViwlvZ6HHA.1164@TK2MSFTNGP02.phx.gbl...
[quoted text, click to view]

I assume you mean CopyTo?

I am having a problem doing the CopyTo. Do you have to do it after you
bind? I am just trying to change the order of the columns in the Page_Load
event before any binding is done.

I tried:

Dim theArray() as DataGridColumn
DataGrid2.Columns.CopyTo(theArray,0) -- error Object reference not set to
an instance of an object

I also tried:

Dim theArray(3) as DataGridColumn
DataGrid2.Columns.CopyTo(theArray,0) -- error
System.IndexOutOfRangeException: Index was outside the bounds of the array

Not sure what the problem is here.

Thanks,

Tom
[quoted text, click to view]

Eliyahu Goldin
8/28/2007 8:50:14 PM
That's right. CopyAt is good for copying and RemoveAt for deleting. Than you
can AddAt an individual item from the array.

--
Eliyahu Goldin,
Software Developer
Microsoft MVP [ASP.NET]
http://msmvps.com/blogs/egoldin
http://usableasp.net


[quoted text, click to view]

AddThis Social Bookmark Button