0

I am using the ZedGraph control (zgc) to create individual stacked bar charts and display them in a single stacked column as shown in the image below.

The issue that I am having is that I have no control over the number of panes that are displayed in the control as this is determined by the number of items in a listbox. It seems that the default nature of the control allows the height of the graph panes to change depending on the number of panes that are displayed within the control.

The zgc is set to dock=fill within a panel control that is set to dock=fill within the form. I would like to force the graph panes to be a static height and when needed have a vertical scroll bar appear in the panel when the number of graph panes exceeds the height of the form. How can I go about achieving this? My code for creating and populating the zgc is posted below the image.

enter image description here

Private Sub CreateGraph(ByVal dat As Date)

    Dim count As Integer = 0
    Dim master As MasterPane = zgc.MasterPane
    master.Fill = New Fill(Color.FromArgb(180, 180, 180), Color.FromArgb(180, 180, 180), 45.0F)
    master.PaneList.Clear()
    master.Title.IsVisible = True
    master.Title.Text = "Workload for " & dat.ToShortDateString()
    master.Margin.All = 10
    master.InnerPaneGap = 5
    master.IsCommonScaleFactor = False

    For Each mach As String In lbMach.Items
        rowCount = 0
        Dim myPaneT As New GraphPane(New Rectangle(10, 10, 10, 10), "", "Time in Minutes", mach)
        myPaneT.Fill.IsVisible = False
        myPaneT.Chart.Fill = New Fill(Color.White, Color.White, 45.0F)
        myPaneT.BaseDimension = 3.0F
        myPaneT.XAxis.Title.IsVisible = False
        myPaneT.XAxis.Scale.IsVisible = False

        myPaneT.XAxis.Scale.Min = 0
        myPaneT.XAxis.Scale.Max = (MeiSettings.WrkHrs * 60)
        myPaneT.Legend.IsVisible = True
        myPaneT.Border.IsVisible = False
        myPaneT.Title.IsVisible = False
        myPaneT.XAxis.MajorTic.IsOutside = False
        myPaneT.XAxis.MinorTic.IsOutside = False
        myPaneT.XAxis.MajorGrid.IsVisible = True
        myPaneT.XAxis.MinorGrid.IsVisible = True
        myPaneT.Margin.All = 1

        If count = lbMach.Items.Count - 1 Then
            myPaneT.XAxis.Title.IsVisible = True
            myPaneT.XAxis.Scale.IsVisible = True
            myPaneT.Margin.Bottom = 10
        End If

        If count > 0 Then
            myPaneT.YAxis.Scale.IsSkipLastLabel = True
        End If

        myPaneT.YAxis.MinSpace = 20
        myPaneT.Y2Axis.MinSpace = 20

        Dim dt As DataTable = ItemsByMachineDT(mach, dat)
        Dim myCurve As BarItem

        If dt.Rows.Count > 0 Then
            Dim profName As String = Nothing
            Dim timeDur() As Double
            For Each dr As DataRow In dt.Rows
                If profName = dr("PRO").ToString() Then
                    timeDur = {((Convert.ToDouble(dr("QTY")) / Convert.ToDouble(dr("MPM"))))}
                Else
                    timeDur = {((Convert.ToDouble(dr("QTY")) / Convert.ToDouble(dr("MPM")) + Convert.ToDouble(dr("Time"))))}
                End If

                myCurve = myPaneT.AddBar(dr("JOB").ToString & " - " & dr("PRO").ToString(), timeDur, Nothing, BarColor(rowCount))

                If MeiSettings.IsGradient = True Then
                    myCurve.Bar.Fill = New Fill(BarColor(rowCount), Color.White, BarColor(rowCount), 90.0F)
                Else
                    myCurve.Bar.Fill = New Fill(BarColor(rowCount), BarColor(rowCount), BarColor(rowCount), 90.0F)
                End If

                rowCount += 1
                profName = dr("PRO").ToString()
            Next
        End If

        myPaneT.YAxis.MajorTic.IsBetweenLabels = True
        myPaneT.YAxis.Type = AxisType.Text
        myPaneT.BarSettings.Type = BarType.Stack
        myPaneT.BarSettings.Base = BarBase.Y
        master.Add(myPaneT)
        count += 1
    Next

    zgc.IsShowPointValues = True

    Using g As Graphics = Me.CreateGraphics()
        master.SetLayout(g, PaneLayout.SingleColumn)
        master.AxisChange(g)
    End Using

End Sub
user1017477
  • 864
  • 1
  • 12
  • 20
  • Just to clarify things, I have played around with the docking of the parent panel and the zedgraph control. I have set the parent panel to autoscroll=true and set the zgc to dock=top. I have tried setting the zgc height based on the number of panes displayed in the graph. This works as expected as far as the scrolling goes however, the graph pane sizes are still inconsistent regardless of the height of the control. So, I am still trying to figure out how to set a specific height for each graph pane. – user1017477 Feb 13 '13 at 13:59

1 Answers1

0

to get control for each GraphPane :

    GraphPane temp = zgc.MasterPane.PaneList.ElementAt(ind); //ind => index of the graphpane in zedgraphcontrol

to set static height n width ZedgraphControl :

    zgc.Size = new Size(Width,Height);

to set visibility of scrollbar ZedgraphControl :

    zgc.IsShowHScrollBar = true;
    zgc.IsShowVScrollBar = true;
koponk
  • 452
  • 1
  • 3
  • 14