Change order of columns in DataGrid dynamically

  • Thread starter Thread starter tshad
  • Start date Start date
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
 
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
 
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
 
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
 
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
 
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
 
Back
Top