Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#图表轴标签格式不正确_C#_Winforms_Asynchronous_Charts_Async Await - Fatal编程技术网

C#图表轴标签格式不正确

C#图表轴标签格式不正确,c#,winforms,asynchronous,charts,async-await,C#,Winforms,Asynchronous,Charts,Async Await,假设我们有一个访问远程数据库的方法调用,大约需要1秒的时间来完成并返回一个DataTable(模拟如下): 这个代码显示了不正确的,未格式化的X轴标签 async void MainForm_Load(object sender, EventArgs e) { var data = await Task.Run(() => GetData()); chart.DataSource = data; chart.DataBind(); } 请注意,删除Thread

假设我们有一个访问远程数据库的方法调用,大约需要1秒的时间来完成并返回一个
DataTable
(模拟如下):

这个代码显示了不正确的,未格式化的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
    事件之前的某个特定类型

    这不是显而易见的,我是通过反编译源代码发现的;如果你真的想关注我的研究,这里有一些里程碑式的进展:

    • 图表
      构造函数:
      this.\u dataManager.Initialize()

    • DataManager.初始化
      chartImage.BeforePaint+=ChartPicture\u BeforePaint

    • DataManager.ChartPicture\u绘制前
    • DataManager.PrepareData
    • Series.PrepareData
      =>
      if(this.\uxvaluetype==ChartValueType.Auto){
      这是.\u xValueType=ChartValueType.Double;

  • 数据绑定
    将尝试根据
    数据源
    自动
    解析为特定类型。如果它不是
    自动
    ,它将不尊重
    数据源
    中的数据类型

  • 好的,那么在您的样本中发生了什么:

  • 当您不使用任务时,整个
    表单加载
    同步执行;当您在图表上调用
    DataBind
    时,它对
    XValueType
    具有
    自动
    ,并根据提供的
    数据源
    解析为
    DateTime

  • 当您将task与sleep一起使用时,
    Paint
    事件在您初始化
    DataSource
    之前发生,它将
    XValueType
    解析为
    Double
    。在绑定DataSource之后,它使用
    DateTime
    的浮点表示

  • 如何修复所有这些混乱?有很多方法,但都基于图表值类型:

    • 表单\u Load
    • 在数据绑定之前删除系列并添加新系列
    • 在数据绑定之前明确指定值类型
    async void MainForm_Load(object sender, EventArgs e)
    {
        var data = GetData();
        chart.DataSource = data;
        chart.DataBind();
    }
    
    async void MainForm_Load(object sender, EventArgs e)
    {
        var data = await Task.Run(() => GetData());
        chart.DataSource = data;
        chart.DataBind();
    }