【问题标题】:Chart control X-axis scrollbar moving when data is added图表控件 X 轴滚动条在添加数据时移动
【发布时间】:2014-09-22 22:20:00
【问题描述】:

更新了代码,让您更好地了解正在发生的事情并让数据加载得更快。 我还没有看到网上发布的任何内容回答了这个问题。

我在 C# 应用程序上有一个 MS Chart 控件(Visual Studio 2010 Express,如果有影响的话)。数据加载速度较慢(每秒一次)。我的意图是一次显示 6 分钟的数据,并能够在必要时滚动到另一页数据。我希望数据从左侧填充图表。随着数据添加到图表中,滚动条和 X 轴图例也会移动,因此我只能看到最新的数据点。我必须向左滚动才能看到较早的数据——添加新数据点时滚动条会跳回来。我希望滚动条保持在一个地方(左边缘),除非我移动它。我的表单上有一个 1 秒计时器,并且每个时间周期都会添加新数据。

我希望这已经足够了。有什么帮助吗?

初始化图表控件的代码:

DateTime startTime = DateTime.Now;
DateTime endTime = startTime.AddMinutes(6);
DateTime maxTime = startTime.AddMinutes(24);
// Bind the chart to the list. 
chartAssociateProductivity.DataSource = Globals.listKohlsPerformanceDataSource;

chartAssociateProductivity.ChartAreas["ChartArea1"].CursorX.AutoScroll = true; // enable autoscroll
chartAssociateProductivity.ChartAreas["ChartArea1"].CursorX.IsUserEnabled = false;
chartAssociateProductivity.ChartAreas["ChartArea1"].CursorX.IsUserSelectionEnabled = false;

chartAssociateProductivity.ChartAreas["ChartArea1"].AxisX.Minimum = startTime.ToOADate();
chartAssociateProductivity.ChartAreas["ChartArea1"].AxisX.Maximum = endTime.ToOADate();
chartAssociateProductivity.ChartAreas["ChartArea1"].AxisX.ScaleView.Zoomable = true;
chartAssociateProductivity.ChartAreas["ChartArea1"].AxisX.ScrollBar.IsPositionedInside = true;
chartAssociateProductivity.ChartAreas["ChartArea1"].AxisX.ScaleView.Zoom(startTime.ToOADate(), 6, DateTimeIntervalType.Minutes);
chartAssociateProductivity.ChartAreas["ChartArea1"].AxisX.ScaleView.Position = 0;// startTime.ToOADate();
chartAssociateProductivity.ChartAreas["ChartArea1"].AxisX.MinorTickMark.Enabled = true;
// disable zoom-reset button (only scrollbar's arrows are available)
chartAssociateProductivity.ChartAreas["ChartArea1"].AxisX.ScrollBar.ButtonStyle = ScrollBarButtonStyles.SmallScroll;

// set scrollbar small change to blockSize (e.g. 100)
chartAssociateProductivity.ChartAreas["ChartArea1"].AxisX.ScaleView.SmallScrollSize = 100;

添加数据的代码(例如,我将添加常量数据):

private void timer1_Tick(object sender, EventArgs e)
{
    listPerformanceDataSource.Add(new PerformanceRecord(0, 248));
}

数据结构:

public class PerformanceRecord
{
    int bagCount, goal;
    public PerformanceRecord(int bagCount, int goal)
    {
        this.bagCount = bagCount;
        this.goal = goal;
    }
    public int BagCount
    {
        get { return bagCount; }
        set { bagCount = value; }
    }
    public int Goal
    {
        get { return goal; }
        set { goal = value; }
    }
}

// Create a list. 
public static List<PerformanceRecord> listPerformanceDataSource = new List<PerformanceRecord>();

【问题讨论】:

  • 嗯,有一些东西丢失了,重现这个。一方面,我们没有RoundUp(如果重要的话?),添加数据的代码也不是可理解的(至少对我而言)。 - 我通过改变和扭曲事物来复制的努力没有成功。一旦我将滚动条设置到左侧,它就会停留在那里。重现问题的另一个问题显然是时间框架:如果需要几个小时(甚至“仅”几分钟)才能看到问题,没有人可以测试你的代码。你能发布一个修改过的版本,它是独立的,并且可重现? (也许当您尝试这样做时问题会解决.. ;-)
  • 感谢收看。我今天会尝试更新帖子。
  • 帖子更新了更详细的信息,运行速度也快了很多。我需要包含有关图表控件的任何内容吗?我仍然看到问题。
  • 我认为(但不是 100% 肯定)这正是该控件的工作原理,并且此功能无法关闭。每当您添加新数据时,您就有机会以编程方式滚动回之前的位置。但是屏幕可能会闪烁。也许当您使用 Invalidate 方法时,您可以获得一些可以接受的结果,但恐怕没有真正简单的解决方案。
  • chartAssociateProductivity.DataSource = Globals.listKohlsPerformanceDataSource; 两个问题,很明显 Kohls 只是一个tyoe,但是图表中的数据绑定是如何定义的呢?它到底是什么图表类型?

标签: c# visual-studio-2010 mschart


【解决方案1】:
ChartArea chartArea=new ChartArea();
chartArea = chart1.ChartAreas[series.ChartArea]; 
int scrollBarVal=chartArea.AxisX.ScaleView.Position;

你必须创建一个 chartArea 实例并使用它的坐标轴位置

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    相关资源
    最近更新 更多