Take the 2-minute tour ×

I am creating a gridview programmatically and I want to use the solution to this question: Programmatically access GridView columns and manipulate.. In other words, I want to hide the hyperlinkfield and instead display a templatefield if the value of the "submitted" column in the row is 1. I'm listing employment applications and letting the user click "Load Application" if they have not yet submitted an application, or displaying "submitted" in plain text if they have already submitted it. I know how to do this if I create my gridview in the aspx file, but I don't know how to do this when I'm creating my gridview at runtime. Here's my code:

Public Sub getSavedApps(ByVal userID As Integer)
        Dim ds As New DataSet
        ds = clsData.sqlGetAllApps(userID)
        If ds.Tables(0).Rows.Count > 0 Then

            'let user select which app they want to work on
            Dim grdAppSelect As New GridView

            'need to find out if this row has a value of 1 or 0 for submitted
            Dim submitted As Boolean

            'position column
            Dim fieldPosition As New BoundField
            fieldPosition.DataField = "positionDesired"
            fieldPosition.HeaderText = "Position Desired"
            If fieldPosition.DataField.ToString = "" Then
                fieldPosition.DataFormatString = "<em>No position specified</em>"
            End If
            Dim colPosition As DataControlField = fieldPosition

            'date column
            Dim fieldDate As New BoundField
            fieldDate.DataField = "dateStarted"
            fieldDate.HeaderText = "Date Started"
            Dim colDate As DataControlField = fieldDate

            Dim strAppID(0) As String
            strAppID(0) = "appID"
            Dim colLoad As DataControlField

            'submitted column
            If submitted Then
                Dim fieldLoad As New TemplateField
                fieldLoad.ItemTemplate = New GridViewTemplate(DataControlRowType.DataRow, "submitted")
                colLoad = fieldLoad
                Dim fieldLoad As New HyperLinkField
                fieldLoad.Text = "<b>Load Application &raquo;</b>"
                fieldLoad.DataTextFormatString = "{0}"
                fieldLoad.DataNavigateUrlFields = strAppID
                fieldLoad.DataNavigateUrlFormatString = "?load={0}"
                colLoad = fieldLoad
            End If

            'add the columns to the gridview
            With grdAppSelect
                .ID = "grdAppSelect"
                .CssClass = "grdAppSelect"
                .CellPadding = 5
                .BorderWidth = "0"
                .HeaderStyle.HorizontalAlign = HorizontalAlign.Left
                With .Columns
                End With
                .AutoGenerateColumns = False
                .DataSource = ds.Tables(0)
            End With

            Dim lnkNew As New HyperLink
            lnkNew.Text = "<b>Start New Application &raquo;</b>"
            lnkNew.NavigateUrl = "?load="

            Dim strClear As New LiteralControl
            strClear.Text = "<br class='clearer' />"

            'add the controls to the panel

            'should be apps there but couldn't find them
            lblGeneralError.Text = "Could not find any previously started applications."
        End If
    End Sub
share|improve this question
add comment

1 Answer

up vote 0 down vote accepted

I found the solution. I needed to add an event handler when I created the gridview so that I could access the RowDataBound event and do the evaluation there. Here's the event handler code I used:

AddHandler grdAppSelect.RowDataBound, AddressOf grdAppSelect_RowDataBound

Then I just did my evaluation during RowDataBound like so:

Sub grdAppSelect_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)

    If e.Row.RowType = DataControlRowType.DataRow Then

        Dim load As Control = e.Row.Controls(2)
        Dim submitted As Control = e.Row.Controls(3)
        Dim submittedText As String = e.Row.Cells(3).Text
        If submittedText = "True" Then
            load.Visible = False
        End If
        submitted.Visible = False

    End If

End Sub
share|improve this answer
add comment

Your Answer


