簡體   English   中英

C#圖表軸標簽未正確格式化

[英]C# Chart Axis Labels Not Formatting Properly

假設我們有一個訪問遠程數據庫的方法調用,大約需要1秒鍾來完成並返回一個DataTable (在下面模擬):

DataTable GetData()
{
    Thread.Sleep(1000); // simulated delay

    var dt = new DataTable("DataTable");
    dt.Columns.Add("DateTime", typeof(DateTime));
    dt.Columns.Add("Value", typeof(double));

    var rand = new Random();
    var date = new DateTime(2016, 1, 1);
    for (int i = 0; i < 1000; i++)
    {
        dt.Rows.Add(date, rand.NextDouble() * 100);

        date = date.AddHours(12);
    }

    return dt;
}

從此方法返回的DataTable用於使用單個行系列填充Chart 為什么此代碼顯示正確,格式正確的DateTime X-Axis標簽:

async void MainForm_Load(object sender, EventArgs e)
{
    var data = GetData();
    chart.DataSource = data;
    chart.DataBind();
}

帶有DateTime X軸的圖表

這段代碼顯示錯誤的,未格式化的X軸標簽?

async void MainForm_Load(object sender, EventArgs e)
{
    var data = await Task.Run(() => GetData());
    chart.DataSource = data;
    chart.DataBind();
}

帶有破X軸的圖表

請注意,即使使用第二個版本,刪除Thread.Sleep()調用也可以解決此問題。

答案在於chart.Series[0].XValueType

首先,幾個陳述:

  1. XValueType默認為Auto ,如果未明確指定,則在Paint事件之前解析為特定類型。

    這不是顯而易見的事情,我通過反編譯來源找到它; 如果你想跟隨我的研究,這里有一些里程碑:

    • Chart構造函數:

      this._dataManager.Initialize();

    • DataManager.Initialize

      chartImage.BeforePaint += ChartPicture_BeforePaint

    • DataManager.ChartPicture_BeforePaint
    • DataManager.PrepareData
    • Series.PrepareData =>

      if (this._xValueType == ChartValueType.Auto) { this._xValueType = ChartValueType.Double;

  2. DataBind將嘗試基於DataSourceAuto解析為特定類型。 如果它不是 Auto ,則不會尊重DataSource數據類型。

好的,你的樣本中發生了什么:

  1. 當你不使用任務時, Form_Load整個主體同步執行; 當您在圖表上調用DataBind時,它具有Auto for XValueType並且基於提供DataSource將其解析為DateTime

  2. 當您使用sleep with sleep時,在初始化DataSource之前會發生Paint事件,這XValueType解析為Double 在此之后,您綁定DataSource,它使用DateTime浮點表示。

如何解決所有混亂局面? 有很多方法,但所有方法都基於圖表值類型:

  • Form_Load顯式指定值類型
  • 刪除系列並在DataBind之前添加新系列
  • DataBind之前顯式指定值類型
  • ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM