Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6238733
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 24, 20262026-05-24T11:15:59+00:00 2026-05-24T11:15:59+00:00

READ FIRST I re-wrote this to make it more readable. If you want to

  • 0

READ FIRST
I re-wrote this to make it more readable. If you want to skip right to the chase, look at the ALL CAPS comments in the code blocks. All necessary code has been included for debugging.

I’ve searched multiple forums (including ASP.NET), and the MSDN library and cannot fix this >.<

GOAL: To dynamically generate a table/grid-like “status report” containing up to 20+ depending on user-specified columns (consideration: should be able to be stored in a cookie for user prefs). This grid will contain data provided from a View on the SQL Server, and row must be clickable. Pagination was super easy to implement, but the sorting has proven to be a nasty challenge.

ISSUE (Scope): I decided to re-post all the relevant code to make it easier to troubleshoot.

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
        chooseColumns()
    End If
End Sub

Protected Function queryToDataSet() As ArrayList
    'Code removed: Function returns the Columns to select from
End Function

'Handles the button click to build the `GridView` from the selected columns
Protected Sub ShowGrid(ByVal sender As Object, ByVal e As EventArgs) Handles btnSub.Click
    For Each item As ListItem In chkFields.Items
        If item.Selected Then
            Dim b As New BoundField()
            b.DataField = item.Value
            b.HeaderText = item.Value
            b.SortExpression = item.Value
            statusReportGrid.Columns.Add(b)
        End If
    Next
--> Me.GetData() 'HERE'S THE SCOPING ISSUE... UPON EXIT THE DATASOURCE IS LOST
End Sub

Private Sub GetData()
    statusReportGrid.DataSource = StatusDS
    statusReportGrid.DataBind()
End Sub

Protected Sub statusReportGrid_Sorting(ByVal sender As Object, ByVal e As GridViewSortEventArgs) Handles statusReportGrid.Sorting
    'CODE BREAKS HERE because the DataSource is no longer in scope
    Dim dataTable As DataTable = TryCast(statusReportGrid.DataSource, DataTable)
    If dataTable IsNot Nothing Then
        Dim dvSortedView As New DataView(dataTable)
        'The following line (when working properly) should return a string
        '  something like "StatusColumn DESC" for example. This format
        '  doesn't make sense to me and doesn't seem correct.
        dvSortedView.Sort = e.SortExpression + " " + getSortDirectionString(e.SortDirection)
        statusReportGrid.DataSource = dvSortedView
        statusReportGrid.DataBind()
    End If
End Sub

Private Function getSortDirectionString(ByVal sortDirection As SortDirection) As String
    Dim newSortDirection As String = String.Empty
    Select Case sortDirection
        Case sortDirection.Ascending
            newSortDirection = "ASC"
        Case sortDirection.Descending
            newSortDirection = "DESC"
    End Select
    Return newSortDirection
End Function

ASP CONTROLS
GridView control (minus the styling stuff) – The tutorials I’ve read said to set the EnableViewState to false. When trying it with a setting of true I get repeated columns on refresh.

<asp:GridView ID="statusReportGrid" runat="server" AutoGenerateColumns="False" 
    AllowPaging="True" AllowSorting="True"
    EnableViewState="False" ShowHeaderWhenEmpty="True"></asp:GridView>

Primary SqlDataSource control for the status report content.

<asp:SqlDataSource ID="StatusDS" runat="server" 
    ConnectionString="<%$ ConnectionStrings:StatusDBConnectionString %>"
    SelectCommand="SELECT * FROM [StatusTable]">
</asp:SqlDataSource>

THE PROBLEM
I just discovered this to be an issue of scope as once my calling function that causes the DataSource to be bound to my GridView exits, the DataSource then becomes empty. I would certainly appreciate some help resolving my scoping issues so that my DataSource remains available and modifiable by all functions in the codebehind. It should be persistent as long as the page is being displayed more or less.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-24T11:16:00+00:00Added an answer on May 24, 2026 at 11:16 am

    Here is an example of doing what you want without a DataSource Control, using a code behind DataTable & Cache along with a custom SortDirection function that manages the sort direction in the view state.

    ''' <summary>
    ''' Show Grid
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Protected Sub ShowGrid(sender As Object, e As EventArgs) Handles ShowGridButton.Click
        BuildGrid()
    End Sub
    
    ''' <summary>
    ''' Sort GridView Columns
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Protected Sub Sorting(ByVal sender As Object, ByVal e As GridViewSortEventArgs) Handles statusReportGrid.Sorting
        Dim dataTable As DataTable = BuildData()
    
        If DataTable IsNot Nothing Then
            Dim dvSortedView As New DataView(dataTable)
    
            dvSortedView.Sort = e.SortExpression + " " + getSortDirectionString()
            statusReportGrid.DataSource = dvSortedView
            statusReportGrid.DataBind()
        End If
    
    End Sub
    
    ''' <summary>
    ''' Get and Store GridView SortDirection
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function getSortDirectionString() As String
        Dim sortDirection As String = "ASC"
    
        If ViewState("GridSortDirection") IsNot Nothing Then
            If ViewState("GridSortDirection").ToString() = "ASC" Then
                sortDirection = "DESC"
            Else
                sortDirection = "ASC"
            End If
        End If
    
        ViewState("GridSortDirection") = sortDirection
    
        Return sortDirection
    End Function
    
    ''' <summary>
    ''' Build Dynamic GridView Columns
    ''' </summary>
    ''' <remarks></remarks>
    Protected Sub BuildGrid()
        Dim dataTable As New DataTable
        dataTable = BuildData()
    
        If dataTable.Rows.Count > 0 Then
            For Each item As ListItem In chkFields.Items
                If item.Selected Then
                    Dim b As New BoundField()
                    b.DataField = item.Value
                    b.HeaderText = item.Value
                    b.SortExpression = item.Value
                    statusReportGrid.Columns.Add(b)
                End If
            Next
    
            statusReportGrid.DataSource = dataTable
            statusReportGrid.DataBind()
        End If
    End Sub
    
    ''' <summary>
    ''' Get DataTable from DB and Use Cache to Store 
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Protected Function BuildData() As DataTable
        Dim dataTable As New DataTable
    
        If Cache("StatusDBResults") IsNot Nothing Then
            dataTable = TryCast(Cache("StatusDBResults"), DataTable)
            Return dataTable
        End If
    
        Dim queryString As String
        queryString = "SELECT * FROM [StatusTable]"
    
        Using connection As New SqlConnection(ConfigurationManager.ConnectionStrings("StatusDBConnectionString").ConnectionString)
            Dim adapter As New SqlDataAdapter()
            adapter.SelectCommand = New SqlCommand(queryString, connection)
            adapter.Fill(dataTable)
    
            'Add To Cache for 2 Minutes for Sorting/Paging/Downloading
            Cache.Add("StatusDBResults", dataTable, Nothing, System.Web.Caching.Cache.NoAbsoluteExpiration, New TimeSpan(0, 2, 0), System.Web.Caching.CacheItemPriority.Default, Nothing)
    
            'MY CODE - Gets the Column Names and dumps them into the ASP.NET CheckBoxList control
            'There may be a better way to do this using the DataTable, but I wasn't able to get that to work. This works and it's pretty fast.
            connection.Open()
            Dim colQuery As New SqlCommand("select column_name from information_schema.columns where table_name = 'StatusTable'", connection)
            Dim dr As SqlDataReader = colQuery.ExecuteReader
            Dim colsArr As New ArrayList
            While dr.Read
                colsArr.Add(dr.Item(0))
            End While
            chkFields.DataSource = colsArr
            chkFields.DataBind()
    
            Return dataTable
        End Using
    End Function
    

    Here is my sample HTML control source that I used for the test….

    <asp:GridView runat="server" AutoGenerateColumns="False" AllowPaging="True" AllowSorting="True" ID="statusReportGrid">
    </asp:GridView>
    <asp:CheckBoxList runat="server" ID="chkFields" RepeatDirection="Horizontal" RepeatLayout="Flow" />
    <asp:Button runat="server" Text="Button" ID="ShowGridButton" />
    

    Let me know if this makes sense, I don’t normally code in VB. The SortDirection is a known issue, because it always returns Ascending. As for the use of a DataTable vs SqlDataSource, both can be used but I find the DataTable approach easier.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have this file which I need to read the first bytes to check
First let me say I have read this useful article thoroughly and am using
First of all I did not write this code. I found it on somebody
Read through this code. I wrote it at my desk in 5 minutes, it's
How can I read the first line from a text file using a Windows
Having just read the first four chapters of Refactoring: Improving the Design of Existing
I've read Head First Java, and I understand how OOP works. Here's my problem:
I recall when I first read Pragmatic Programmer that they suggested using scripting languages
I have to parse a file, and indeed a have to read it first,
First I've read loads of posts and sites that recommend going to http://silverlight.net/GetStarted/ to

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.