Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsFree MagazinesWhite PapersSubmit Content
Discussion GroupsASP.NETWindows FormsLanguages.NET FrameworkVisual Studio.NET
Articles.NET FrameworkASP.NETToolsWindows Forms
.NET DirectoryOpen Source ProjectsUser GroupsWeb Resources
Related Topics
Visual Basic 6SQL ServerMS AccessOther DB ProductsMS Server ProductsMore Topics ...

.NET Forum / ASP.NET / General / August 2007

Tip: Looking for answers? Try searching our database.

Change order of columns in DataGrid dynamically

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
tshad - 23 Aug 2007 03:48 GMT
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 - 23 Aug 2007 08:54 GMT
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.

Signature

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.
[quoted text clipped - 72 lines]
>
> Tom
tshad - 23 Aug 2007 18:02 GMT
> 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

>>I am trying to allow my clients to specify the order that columns show in
>>a datagrid.
[quoted text clipped - 72 lines]
>>
>> Tom
Eliyahu Goldin - 26 Aug 2007 09:33 GMT
> 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).

Signature

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

>> You just need to operate on DataGrid.Columns collection in code-behind.
>> Look at the DataGridColumnCollection class, it has a few methods like
[quoted text clipped - 92 lines]
>>>
>>> Tom
tshad - 28 Aug 2007 17:22 GMT
>> 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
[quoted text clipped - 5 lines]
> 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

>>> You just need to operate on DataGrid.Columns collection in code-behind.
>>> Look at the DataGridColumnCollection class, it has a few methods like
[quoted text clipped - 94 lines]
>>>>
>>>> Tom
Eliyahu Goldin - 28 Aug 2007 18:50 GMT
That's right. CopyAt is good for copying and RemoveAt for deleting. Than you
can AddAt an individual item from the array.

Signature

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

>>> 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
[quoted text clipped - 121 lines]
>>>>>
>>>>> Tom
tshad - 28 Aug 2007 19:09 GMT
> 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

>>>> 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
[quoted text clipped - 121 lines]
>>>>>>
>>>>>> Tom

Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.