Change order of columns in DataGrid dynamically

T

tshad

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
 
T

tshad

Eliyahu Goldin said:
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.

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
--
Eliyahu Goldin,
Software Developer
Microsoft MVP [ASP.NET]
http://msmvps.com/blogs/egoldin
http://usableasp.net


tshad said:
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
 
E

Eliyahu Goldin

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?

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


tshad said:
Eliyahu Goldin said:
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.

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
--
Eliyahu Goldin,
Software Developer
Microsoft MVP [ASP.NET]
http://msmvps.com/blogs/egoldin
http://usableasp.net


tshad said:
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
 
T

tshad

Eliyahu Goldin said:
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).

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
--
Eliyahu Goldin,
Software Developer
Microsoft MVP [ASP.NET]
http://msmvps.com/blogs/egoldin
http://usableasp.net


tshad said:
Eliyahu Goldin said:
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.

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
--
Eliyahu Goldin,
Software Developer
Microsoft MVP [ASP.NET]
http://msmvps.com/blogs/egoldin
http://usableasp.net


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
 
E

Eliyahu Goldin

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


tshad said:
Eliyahu Goldin said:
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).

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
--
Eliyahu Goldin,
Software Developer
Microsoft MVP [ASP.NET]
http://msmvps.com/blogs/egoldin
http://usableasp.net


tshad said:
message 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.

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

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


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
 
T

tshad

Eliyahu Goldin said:
That's right. CopyAt is good for copying and RemoveAt for deleting. Than
you can AddAt an individual item from the array.

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
--
Eliyahu Goldin,
Software Developer
Microsoft MVP [ASP.NET]
http://msmvps.com/blogs/egoldin
http://usableasp.net


tshad said:
Eliyahu Goldin said:
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?

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).

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
--
Eliyahu Goldin,
Software Developer
Microsoft MVP [ASP.NET]
http://msmvps.com/blogs/egoldin
http://usableasp.net


message 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.

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

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


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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,764
Messages
2,569,564
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top