Grandizer
Grandizer

Reputation: 3025

ASP.Net Chart - Label With Extra Data Not Used In Chart?

I have an asp:Chart control and it is working great. I simply am passing it times (in millitary format) and then values that are average length in time of requests. The following code does what I need - almost (feel free to mark it up if I am going overboard for I am new to the chart control).

My data is in table for like the following:

Date by Hours 9:00 10:00 11:00 12:00 13:00 14:00 15:00 16:00 17:00 18:00 
12/03/2010     8    43    53    55    33    46    51    60    50     9 
Friday       1.773 1.337 1.242 1.239 1.340 1.191 1.479 1.223 1.178 1.516 

Gives me a nice chart. My question is below this code:

List<double> yValues = new List<double>();
List<string> xValues = new List<string>();

// First and Last columns do not contain chartable data
for (int i = 1; i < dtResults.Columns.Count - 1; i++) {
    double d;
    if (double.TryParse(dtResults.Rows[1][i].ToString(), out d))
        yValues.Add(d == 0 ? double.NaN : d);
    else
        yValues.Add(double.NaN);
} // foreach of the Average Time Values the chart

// foreach of the column names
for (int i = 1; i < dtResults.Columns.Count - 1; i++)
    xValues.Add(dtResults.Columns[i].ColumnName);

this.Chart.Titles["Title1"].Text = string.Format(
    "Average Request Time In Seconds On {0:MM/dd/yyyy} Between {1:HH} and {2:HH} In {3}",
    this.DateRange.BeginDate.Value,
    this.ucsTimePicker.BeginTime,
    this.ucsTimePicker.EndTime,
    this.SelectedSourceEnvironmentName
);
this.Chart.Series["Series1"].Points.DataBindXY(xValues, yValues);
this.Chart.Series["Series1"].ChartType = SeriesChartType.Line;
this.Chart.Series["Series1"].IsValueShownAsLabel = true;
this.Chart.Series["Series1"]["ShowMarkerLines"] = "true";
this.Chart.Series["Series1"].Label = "#VALY{0.000}"; // Make sure they have only 3 decimal places

this.Chart.ChartAreas["ChartArea1"].AxisX.IsMarginVisible = true;
this.Chart.ChartAreas["ChartArea1"].AxisX.Title = "Hours of the Day";
this.Chart.ChartAreas["ChartArea1"].AxisY.Title = "Time in Seconds";

// Handle styling when there is a Zero or missing value
this.Chart.Series["Series1"].EmptyPointStyle.Color = Color.Red;
this.Chart.Series["Series1"].EmptyPointStyle.BorderWidth = 3;
this.Chart.Series["Series1"].EmptyPointStyle.BorderDashStyle = ChartDashStyle.Dash;
this.Chart.Series["Series1"].EmptyPointStyle.MarkerStyle = MarkerStyle.Diamond;
this.Chart.Series["Series1"].EmptyPointStyle.MarkerColor = Color.Red;
this.Chart.Series["Series1"].EmptyPointStyle.MarkerSize = 8;
this.Chart.Series["Series1"].EmptyPointStyle.MarkerBorderColor = Color.Black;
this.Chart.Series["Series1"]["EmptyPointValue"] = "Zero";

There are labels showing (the decimal numbers in the table above) but what I want to do is have the label Also show the total number of requests which is the 2nd row of data in the table above. I was able to add the values to the chart with the code below:

for (int i = 1; i < dtResults.Columns.Count - 1; i++) {
  int n;
  if (int.TryParse(dtResults.Rows[0][i].ToString(), out n))
    this.Chart.Series["Series1"].Points.AddY(n);
  else
    this.Chart.Series["Series1"].Points.AddY(0);
} // foreach of the Count of Request within the Hour values

That seemed to not throw any fits, but I couldn't access the values with the following adjustment:

this.Chart.Series["Series1"].Label = "#VALY{0.000}\n#VALY2{0}";

All I get is the original value (1.773) showing up twice.

So is there a way to add data to a Chart that is only for labeling purposes and then access it?

Upvotes: 2

Views: 7970

Answers (1)

Grandizer
Grandizer

Reputation: 3025

Okay, after no help here (which actually shocks me) I was able to figure it out with some help outside of this site. Essentially, I don't have to Add the "extra" data but I do have to modify each Label as opposed to just having the generic label like the following:

this.Chart.Series["Series1"].Label = "#VALY{0.000}"; // Make sure they have only 3 decimal places      

I also had to take out the following line:

this.Chart.Series["Series1"].IsValueShownAsLabel = true;

So just for brevity, here is the entire code giving me the two line label where the first line shows the average (which is the actual chart data) and the second line is the count which is not in the data at all.

List<double> yValues = new List<double>();
List<string> xValues = new List<string>();
List<int> zValues = new List<int>();

// First and Last columns do not contain chartable data
for (int i = 1; i < dtResults.Columns.Count - 1; i++) {
    double d;
    if (double.TryParse(dtResults.Rows[1][i].ToString(), out d))
        yValues.Add(d == 0 ? double.NaN : d);
    else
        yValues.Add(double.NaN);
} // foreach of the Average Time Values the chart

// foreach of the column names
for (int i = 1; i < dtResults.Columns.Count - 1; i++)
    xValues.Add(dtResults.Columns[i].ColumnName);

this.Chart.Titles["Title1"].Text = string.Format(
    "Average Request Time In Seconds On {0:MM/dd/yyyy} Between {1:HH} and {2:HH} In {3}",
    this.DateRange.BeginDate.Value,
    this.ucsTimePicker.BeginTime,
    this.ucsTimePicker.EndTime,
    this.SelectedSourceEnvironmentName
);
this.Chart.Series["Series1"].Points.DataBindXY(xValues, yValues);

/// This loop will setup the point labels in a two line format where the first line displays
/// the Average that the point is actually showing.  The second line is data taken from the
/// results table and is not a part of the chart at all but is useful information and is the
/// Count of records in that time frame.
/// In order for this to work, the Series property IsValueShownAsLabel needs to be NOT True.
for (int i = 0; i < this.Chart.Series["Series1"].Points.Count; i++) {
    int n = 0;
    int.TryParse(dtResults.Rows[0][i + 1].ToString(), out n);

    this.Chart.Series["Series1"].Points[i].Label = string.Format("Avg: #VALY{{0.000}}\nCount: {0}", n);
} // foreach of the Count of Request within the Hour values

this.Chart.Series["Series1"].ChartType = SeriesChartType.Line;
this.Chart.Series["Series1"]["ShowMarkerLines"] = "true";
this.Chart.ChartAreas["ChartArea1"].AxisX.IsMarginVisible = true;
this.Chart.ChartAreas["ChartArea1"].AxisX.Title = "Hours of the Day";
this.Chart.ChartAreas["ChartArea1"].AxisY.Title = "Time in Seconds";

// Handle styling when there is a Zero or missing value
this.Chart.Series["Series1"].EmptyPointStyle.Color = Color.Red;
this.Chart.Series["Series1"].EmptyPointStyle.BorderWidth = 3;
this.Chart.Series["Series1"].EmptyPointStyle.BorderDashStyle = ChartDashStyle.Dash;
this.Chart.Series["Series1"].EmptyPointStyle.MarkerStyle = MarkerStyle.Diamond;
this.Chart.Series["Series1"].EmptyPointStyle.MarkerColor = Color.Red;
this.Chart.Series["Series1"].EmptyPointStyle.MarkerSize = 8;
this.Chart.Series["Series1"].EmptyPointStyle.MarkerBorderColor = Color.Black;
this.Chart.Series["Series1"]["EmptyPointValue"] = "Zero";

Upvotes: 1

Related Questions