2009-03-20 12 views
7

Ich habe eine StackedBar, die 5 Werte pro Balken anzeigt, wobei der Datenwert in der Mitte jedes Blocks angezeigt wird. So weit, ist es gut. Wenn der Wert jedoch Null ist, wird der Wert immer noch angezeigt, was bei vielen Nullen unschön ist.So blenden Sie die Datenpunktbeschriftung aus, wenn in einer StackedBar der Wert 0 ist.

Ich möchte in der Lage sein, das Etikett für eine Null zu verbergen. Wie kann ich das machen?

(Ich nehme an, ich könnte es auf lange Sicht machen, indem ich die Daten Zeile für Zeile lese und das Diagramm Schritt für Schritt erstelle, aber ich würde es vorziehen, die Abfrageergebnisse einfach an das Steuerelement zu übergeben) .

Antwort

5

Sie können Etiketten im Falle anpassen verstecken:

protected void SummaryChart_Customize(object sender, EventArgs e) 
{ 
    //hide label value if zero 
    foreach (System.Web.UI.DataVisualization.Charting.Series series in SummaryChart.Series) 
    { 
     foreach (System.Web.UI.DataVisualization.Charting.DataPoint point in series.Points) 
     { 
      if (point.YValues.Length > 0 && (double)point.YValues.GetValue(0) == 0) 
      { 
       point.IsValueShownAsLabel = false; 
      } 
      else 
      { 
       point.IsValueShownAsLabel = true; 
      } 
     } 
    } 
} 
2

eines benutzerdefinierten Zahlenformat verwenden, das Nullen, so etwas wie

Allgemeine unterdrückt ;;;

0,0% ;;;

$ #, ## 0.00 ;;;

0

hatte ich das gleiche Problem und ich löste es die folgende Zahlenformat verwenden

[=0]"";0.0% 

Der erste Teil:

[=0]"" 

bedeutet, dass: wenn der Wert, der gleich ist es eine Anzeige auf Null sollte leere Zeichenfolge

Der zweite Teil:

0.0% 

In diesem speziellen Fall bedeutet, dass alle anderen Werte als Prozent mit einer Dezimalzahl angezeigt werden sollen. Jedes Zahlenformat kann als zweiter Teil verwendet werden.

[=0];General (Standard in some localized versions of Excel) 

kann verwendet werden, um das Standardformat zu verwenden.

VBA es wäre:

Dim area as range 
'The data area for the chart' 
set area = Sheet1.range("A1:B3") 
area.NumberFormat = "[=0];General" 
4

Jims Lösung nicht für mich arbeiten, aber hier ist, wie ich es geschafft habe, die Verwendung einiger seiner Code machen - dank Jim!

  1. Richten Sie im Designer ein EmptyPointStyle-Element unter dem relevanten Series-Element ein. Dies sollte den Wert so einstellen, dass er nicht als Beschriftung und nicht in der Legende angezeigt wird.
  2. Verwenden Sie im Code-Behind das Ereignis DataBound oder Customize, um die Nullpunkte auszublenden, indem Sie ihre IsEmpty-Eigenschaft auf True setzen.

Code:

  1. Im ASPX:

    <Series> 
         <asp:Series ChartType="Pie" Name="Series1" ..etc....> 
          <EmptyPointStyle IsValueShownAsLabel="false" IsVisibleInLegend="false" />    
         </asp:Series> 
        </Series> 
    
  2. Im Code hinter (yep VB hier!):

(Anmerkung:. Ich alle Punkte an diesem Kreisdiagramm zur Explosion habe als auch, was auf diese Frage nicht relevant ist, aber ich es links in dem Fall hilft es jemand)

Protected Sub Chart1_DataBound(sender As Object, e As EventArgs) Handles Chart1.DataBound 
    Dim chart As Chart = TryCast(sender, Chart) 

    If chart IsNot Nothing Then 
     ' Explode all points 
     For Each p As DataPoint In chart.Series(0).Points 
      p.CustomProperties = "Exploded=true" 

      ' Remove zero points 
      If p.YValues.Length > 0 AndAlso p.YValues.GetValue(0) = 0 Then 
       p.IsEmpty = True 
      End If 
     Next 
    End If 
End Sub 
+0

Ich habe dies markiert, weil zu C# point.IsEmpty umgewandelt = true ist der Schlüssel zum Erfolg, dies ist erforderlich, wenn Sie point.IsValueShownAsLabel benötigen = true und setze anschließend Series [chartSeries] .LabelFormat = "mm: ss"; – peterincumbria

3

diese Arbeit perfekt für mich

foreach (System.Web.UI.DataVisualization.Charting.Series series in SummaryChart.Series) 
    { 
    foreach (System.Web.UI.DataVisualization.Charting.DataPoint point in series.Points) 
    { 
     if (point.YValues.Length > 0 && (double)point.YValues.GetValue(0) == 0) 
     { 
       point.LegendText = point.AxisLabel;//In case you have legend 
       point.AxisLabel = string.Empty; 
       point.Label = string.Empty; 
     } 
    } 
    } 
1

dies ist für mich arbeiten

For Each s As Series In Chart1.Series 
    For Each dp As DataPoint In s.Points 
     If dp.YValues(0) = 0 Then 
      dp.IsEmpty = True 
     End If 
    Next 
Next 
2

Das funktionierte richtig (ich es nur für eine Serie getestet)

foreach (System.Windows.Forms.DataVisualization.Charting.DataPoint point in chartShow.Series["S3"].Points) 
{ 
    if (point.YValues.Length > 0 && (double)point.YValues.GetValue(0) == 0) 
    { 
      point.IsEmpty = true; 
    } 
    else 
    { 
      point.IsEmpty = false; 
    } 
}