【问题标题】:ASP.NET Chart control set month names from int value on X Axis labelsASP.NET 图表控件从 X 轴标签上的 int 值设置月份名称
【发布时间】:2014-03-14 09:03:58
【问题描述】:

我想将图表 X 轴上的数字 (1, 2, 3, ...) 替换为对应的月份名称。

这是我的实际图表:

在填充 SeriesDataView 上,我有一个“MONTH”列,其中包含从 1 到 12 的值。 我还必须手动将 MinimumMaximum 值设置为 0 和 13,否则我会丢失第一列和最后一列,因为第一个 X 轴列的开头和 Y 轴之间以及图表区域的最后一个 X 轴列末端。

<ChartAreas>
    <asp:ChartArea Name="ChartArea1">
        <AxisX IsStartedFromZero="True" Title="Mese"
            TitleFont="Segoe UI, 10pt, style=Bold" IsLabelAutoFit="False" LineColor="Gray"
            Minimum="0" Maximum="13">
            <MajorGrid LineColor="LightGray" />
            <LabelStyle Font="Segoe UI, 9pt" />
        </AxisX>
    </asp:ChartArea>
</ChartAreas>

所以,如果我用月份名称替换 int 值,我还需要删除 Min 和 Max 参数,但我想保持现在的空间。

我尝试了这里和其他地方建议的一些解决方案,但没有结果。 最简单、最有效、最直接的似乎是这样的:

Chart1.ChartAreas[0].AxisX.LabelStyle.Format = "MMM";

但它不起作用。相反,我得到“MMM”字符串来代替整数值。

是否可以像在 GridView 上一样拦截 DataBind 事件,用月份名称替换整数值?

【问题讨论】:

    标签: asp.net formatting mschart axis-labels


    【解决方案1】:

    我认为您必须使用自定义标签。 我使用了thisthis

    背后的代码:

    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace WebTest_1
    {
        public partial class _Default : Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                Chart1.Series[0].Points.AddXY(1, 83);
                Chart1.Series[0].Points.AddXY(2, 63);
                Chart1.Series[0].Points.AddXY(3, 53);
                Chart1.Series[0].Points.AddXY(4, 77);
                Chart1.Series[0].Points.AddXY(5, 46);
                Chart1.Series[0].Points.AddXY(6, 99);
                Chart1.Series[0].Points.AddXY(7, 72);
                Chart1.Series[0].Points.AddXY(8, 39);
                Chart1.Series[0].Points.AddXY(9, 42);
                Chart1.Series[0].Points.AddXY(10, 71);
                Chart1.Series[0].Points.AddXY(11, 58);
                Chart1.Series[0].Points.AddXY(12, 63);
    
                Chart1.Series[1].Points.AddXY(1 , 46);
                Chart1.Series[1].Points.AddXY(2 , 72);
                Chart1.Series[1].Points.AddXY(3 , 53);
                Chart1.Series[1].Points.AddXY(4 , 39);
                Chart1.Series[1].Points.AddXY(5 , 63);
                Chart1.Series[1].Points.AddXY(6 , 71);
                Chart1.Series[1].Points.AddXY(7 , 75);
                Chart1.Series[1].Points.AddXY(8 , 99);
                Chart1.Series[1].Points.AddXY(9 , 83);
                Chart1.Series[1].Points.AddXY(10, 63);
                Chart1.Series[1].Points.AddXY(11, 58);
                Chart1.Series[1].Points.AddXY(12, 42);
            }
    
            protected void Chart1_Customize(object sender, EventArgs e)
            {
                foreach (var lbl in Chart1.ChartAreas[0].AxisX.CustomLabels)
                {
                    int monthNumber = int.Parse(lbl.Text);
                    if (monthNumber >= 1 && monthNumber <= 12)
                        lbl.Text = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(monthNumber);
                    else
                        lbl.Text = "";
                }
            }
        }
    }
    

    输出:

    您需要分配自定义事件。

    【讨论】:

    • 谢谢,它有效!无论如何,我认为有可能使用Chart1.ChartAreas[0].AxisX.LabelStyle.Format 属性,这将是一个更优雅的解决方案。
    • 如果您有实际的 DateTime 值 (like this),这可能会起作用
    • 我尝试了其他解决方案,并用新结果更新了这个问题。你能看一下吗?
    • 您的 int 值转换为月份名称。您的轴显示正常,但它代表 2013-01-01 到 31-12-2013(在 OAdates 中)而不是通用月份。这意味着它的值介于 41275 和 41639 之间。您的数据介于 1 和 12 之间,因此不会显示。
    • 好的。绝对不可能...我会继续使用Customize 事件解决方案!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 2022-01-21
    • 2021-12-23
    相关资源
    最近更新 更多