[英]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();
}
這段代碼顯示錯誤的,未格式化的X軸標簽?
async void MainForm_Load(object sender, EventArgs e)
{
var data = await Task.Run(() => GetData());
chart.DataSource = data;
chart.DataBind();
}
請注意,即使使用第二個版本,刪除Thread.Sleep()
調用也可以解決此問題。
答案在於chart.Series[0].XValueType
首先,幾個陳述:
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;
DataBind
將嘗試基於DataSource
將Auto
解析為特定類型。 如果它不是 Auto
,則不會尊重DataSource
數據類型。
好的,你的樣本中發生了什么:
當你不使用任務時, Form_Load
整個主體同步執行; 當您在圖表上調用DataBind
時,它具有Auto
for XValueType
並且基於提供DataSource
將其解析為DateTime
。
當您使用sleep with sleep時,在初始化DataSource
之前會發生Paint
事件,這XValueType
解析為Double
。 在此之后,您綁定DataSource,它使用DateTime
浮點表示。
如何解決所有混亂局面? 有很多方法,但所有方法都基於圖表值類型:
Form_Load
顯式指定值類型 DataBind
之前添加新系列 DataBind
之前顯式指定值類型
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.