2014-01-26 13 views
2

我正在使用asp.net生成一个图表,该图表与下面的代码生成的图表类似。 请注意,每个图例项占用三条线,但符号是垂直居中对齐,这我觉得看起来不清楚:如何使asp:图表图例符号垂直对齐

Chart legend with vertically central alignment

是否可以垂直对齐的符号,使其就位于旁边的第一线文本(例如,第一条蓝线应位于“某个名称-1”旁边)?或者,可以配置某种分离器吗?无论哪种方式,我宁愿垂直对齐,但两个选项一起会很好。

完整的示例代码:

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load 
    Dim chart1 As New Chart 
    Page.Controls.Add(chart1) 
    chart1.ChartAreas.Add(New ChartArea) 
    Dim l As New Legend 
    chart1.Legends.Add(l) 
    Dim dt As New DataTable 
    dt.Columns.Add(New DataColumn With {.ColumnName = "ColA", .DataType = GetType(System.String)}) 
    dt.Columns.Add(New DataColumn With {.ColumnName = "ColB", .DataType = GetType(System.Int32)}) 
    dt.Columns.Add(New DataColumn With {.ColumnName = "ColC", .DataType = GetType(System.Int32)}) 
    dt.Columns.Add(New DataColumn With {.ColumnName = "ColD", .DataType = GetType(System.Int32)}) 
    Dim rnd As New Random 
    For i As Integer = 1 To 5 
     Dim dr As DataRow = dt.NewRow 
     dr.Item("ColA") = String.Format("{0} {1}", "Some name - ", i.ToString) 
     dr.Item("ColB") = rnd.Next(0, 100) 
     dr.Item("ColC") = rnd.Next(0, 100) 
     dr.Item("ColD") = rnd.Next(0, 100) 
     dt.Rows.Add(dr) 
    Next 
    Dim gv As New GridView 
    Page.Form.Controls.Add(gv) 
    gv.DataSource = dt 
    gv.DataBind() 
    For Each dr As DataRow In dt.Rows 
     Dim s As New Series 
     s.Name = dr.Item("ColA").ToString 
     s.ChartType = SeriesChartType.Line 
     s.LegendText = s.Name & Environment.NewLine & "Line 2" & Environment.NewLine & "Line 3" 
     chart1.Series.Add(s) 
     For i As Integer = 1 To dt.Columns.Count - 1 
      Dim p As New DataPoint 
      p.SetValueY(Convert.ToInt32(dr.Item(i))) 
      p.AxisLabel = dt.Columns(i).ColumnName 
      Trace.Warn(dt.Columns(i).ColumnName & " = " & Convert.ToInt32(dr.Item(i)).ToString) 
      s.Points.Add(p) 
     Next 
    Next 
    chart1.DataBind() 
End Sub 
+1

不完全是一个答案,但你尝试过每一个图例项后加入空行?那应该看起来更清楚了。 – nothrow

+0

谢谢Yossarian。是的,我试过了。它看起来更好,但当图表中有很多数据时,可以大大扩展图例的大小。谢谢,虽然;一个有价值的贡献 – EvilDr

回答

3

可以使用Chart.CustomizeLegend event定制图例项目的排列和分隔符:

Imports System.Drawing 

Protected Sub Chart_CustomizeLegend(sender As Object, e As CustomizeLegendEventArgs) 
    For Each item As LegendItem In e.LegendItems 
     ' Align the series symbol. 
     item.Cells(0).Alignment = ContentAlignment.TopCenter 

     ' Add a separator. 
     item.SeparatorType = LegendSeparatorStyle.Line 
     item.SeparatorColor = Color.LightGray 
    Next 
End Sub 

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load 
    Dim chart1 As New Chart 

    ' Bind to the CustomizeLegend event. 
    AddHandler chart1.CustomizeLegend, AddressOf Chart_CustomizeLegend 

    Page.Controls.Add(chart1) 
    chart1.ChartAreas.Add(New ChartArea) 
    Dim l As New Legend 

    ' ... The rest of your code... 
End Sub 
+0

Ohhh yes!奇迹般有效。谢谢。对于任何希望复制和粘贴此答案的人来说,您需要'Imports System.Drawing'或将ContentAlignment.TopCenter更改为'Drawing.ContentAlignment.TopCenter' – EvilDr

+1

@EvilDr更新了导入的答案=) –

+0

这是只能在'Chart.CustomizeLegend'事件中做,或者可以在DataBinding之后访问'Legend'吗?只是为了清楚...! – EvilDr

0

删除我以前的答案,你就在您的评论明显。

我可以再试一次吗?那么怎么样:因为这条线被放置在该行的中间,那么图例开头的三条空行怎么样?这样该行将显示在“某个名称”旁边。

s.LegendText = Environment.NewLine & Environment.NewLine & Environment.NewLine & s.Name & Environment.NewLine & "Line 2" & Environment.NewLine & "Line 3" 
+0

不,它不会像我所害怕的那样工作。 ASP.NET将图例呈现为表格(我相信)然后在呈现之前对齐内容。我需要的是访问表格(或其他)属性,或者图例符号的垂直对齐属性 – EvilDr