tags:

views:

1924

answers:

2

I have a Gridview that I create a dynamic footer wired up to the RowDataBound event.

However there is a 50/50 chance that 3 of the columns will have no data.

I want to be able to dynamically hide the columns with no data if possible.

I have tried doing this in the RowDatabound event by checking if the value is = 0 but that does not work because I think the event is called to early?

Is there anyway to refer to the values in the Footer row after ALL the data has been bound?

Ideally in VB

`Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound




    If e.Row.RowType = DataControlRowType.DataRow Then
        TotalOffered += DataBinder.Eval(e.Row.DataItem, "Offered")
        TotalHandled += DataBinder.Eval(e.Row.DataItem, "Handled")
        TotalHandled30 += DataBinder.Eval(e.Row.DataItem, "Handled30")
        TotalHandlingTime += (DataBinder.Eval(e.Row.DataItem, "AHT") * DataBinder.Eval(e.Row.DataItem, "Handled"))
        TotalTalkTime += ((DataBinder.Eval(e.Row.DataItem, "AHT") * DataBinder.Eval(e.Row.DataItem, "Talk"))) * DataBinder.Eval(e.Row.DataItem, "Handled")
        TotalHoldTime += ((DataBinder.Eval(e.Row.DataItem, "AHT") * DataBinder.Eval(e.Row.DataItem, "Hold"))) * DataBinder.Eval(e.Row.DataItem, "Handled")
        TotalWrapTime += ((DataBinder.Eval(e.Row.DataItem, "AHT") * DataBinder.Eval(e.Row.DataItem, "Work"))) * DataBinder.Eval(e.Row.DataItem, "Handled")

        ' If there is agent data calculate a running total
        If IsDBNull(DataBinder.Eval(e.Row.DataItem, "Pri_Agent_Sign_in")) Then
            GridView1.Columns(0).Visible = False


        Else
            TotalSignedin += DataBinder.Eval(e.Row.DataItem, "Pri_Agent_Sign_in")
            TotalAvail += DataBinder.Eval(e.Row.DataItem, "Pri_Agent_Sign_in") * DataBinder.Eval(e.Row.DataItem, "Avail_Time")
            TotalIdle += DataBinder.Eval(e.Row.DataItem, "Pri_Agent_Sign_in") * DataBinder.Eval(e.Row.DataItem, "Unavail_Time")



        End If

        ' If there is forecast data calculate a running total

        If IsDBNull(DataBinder.Eval(e.Row.DataItem, "ORG_FOR_VOL")) Then


        Else
            TotalForecastVolume += DataBinder.Eval(e.Row.DataItem, "ORG_FOR_VOL")
            TotalForecastAHT += DataBinder.Eval(e.Row.DataItem, "ORG_FOR_VOL") * DataBinder.Eval(e.Row.DataItem, "ORG_FOR_AHT")
        End If



    ElseIf e.Row.RowType = DataControlRowType.Footer Then
        e.Row.Cells(0).Text = "Totals : "
        e.Row.Cells(1).Text = TotalOffered.ToString
        e.Row.Cells(2).Text = TotalHandled.ToString
        e.Row.Cells(3).Text = TotalHandled30.ToString
        e.Row.Cells(4).Text = (TotalHandled / TotalOffered).ToString("#0%")
        e.Row.Cells(5).Text = (TotalHandled30 / TotalHandled).ToString("#0%")
        e.Row.Cells(6).Text = (TotalHandlingTime / TotalHandled).ToString("N0")
        e.Row.Cells(7).Text = (TotalTalkTime / TotalHandlingTime).ToString("#0%")
        e.Row.Cells(8).Text = (TotalHoldTime / TotalHandlingTime).ToString("#0%")
        e.Row.Cells(9).Text = (TotalWrapTime / TotalHandlingTime).ToString("#0%")


        ' If agent data then add total data to footer
        If TotalSignedin = 0 Then

        Else

            e.Row.Cells(11).Text = (TotalAvail / TotalSignedin).ToString("#0%")
            e.Row.Cells(12).Text = (TotalIdle / TotalSignedin).ToString("#0%")
            e.Row.Cells(12).HorizontalAlign = HorizontalAlign.Center

        End If

        If TotalForecastVolume = 0 Then

        Else

            e.Row.Cells(13).Text = TotalForecastVolume.ToString
            e.Row.Cells(14).Text = (TotalForecastAHT / TotalForecastVolume).ToString("F0")

        End If

    End If`
A: 

If i correctly understand what your asking, then the code you want should look something like this (I'm using vb.net 2008 and the closest item i have to a grid view is DataGridView. if your using aspx then let me know and i'll generate some code for it):

For i = 0 To DataGridView1.ColumnCount - 1
        If DataGridView1.Rows(0).Cells(i).Value = "" Then
            DataGridView1.Columns(i).Visible = False
        End If
    Next

This is of course code for after the grid is filled.

Here is the code you could put into your aspx.vb file after your GridView is completely loaded:

For i = 0 To GridView1.Columns.Count - 1
        If GridView1.FooterRow.Cells(i).Text = "" Then
            GridView1.Columns(0).Visible = False
        End If
    Next

If you want to hide the column as you populate the gridview then you will have to put up your code.

Bryan
Sorry, yes I am using ASPX, would I put this in the Row Databound event? I am looking specifically to address the footer row?
David A
give me a few minutes to download the express version for aspx onto my work computer and ill try to upload some code for it if no one has given you a good solution by then.
Bryan
You would put this right after the GridView is done loading. If you know that all of the rows, or even one row consistently, that will have nothing in it and if this is indeed the criteria you want to use to make the column not visible then i see no reason why accessing the footer data is necessary. However the web developer just got done downloading so i'll look at it now.
Bryan
Thanks,I needed to add a bit to check if an the grid was rendered but after that it works like a charm!
David A
A: 

Try this in RowCreated. This is my guess without being able to see any of your code.

 Protected Sub GridView1_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowCreated
    If e.Row.RowType = DataControlRowType.Footer Then
        If e.Row.Cells(0).Text = "" Then
            GridView1.Columns(0).Visible = False
        End If
    End If
End Sub
Eric
This throws back an error telling me ArgumentException: Column 'X' does not belong to table DefaultView
David A
can you put the columns that may or may not be there in a template field? check out this link forums.asp.net/p/1074931/1577355.aspx
Eric