How to reproduce: public partial class Form1 : Form { private RangeSelectorViewElement chartElement; public Form1() { InitializeComponent(); new RadControlSpyForm().Show(); this.SetupChart(); this.radRangeSelector1.AssociatedControl = this.radChartView1; this.chartElement = this.radRangeSelector1.RangeSelectorElement.AssociatedElement as RangeSelectorViewElement; this.chartElement.SeriesInitializing += new SeriesInitializingEventHandler(chartElement_SeriesInitializing); } private void chartElement_SeriesInitializing(object sender, SeriesInitializingEventArgs e) { e.SeriesType = typeof(LineSeries); } private void SetupChart() { LineSeries lineSeries = new LineSeries(); lineSeries.DataPoints.Add(new CategoricalDataPoint(20, "Jan")); lineSeries.DataPoints.Add(new CategoricalDataPoint(22, "Apr")); lineSeries.DataPoints.Add(new CategoricalDataPoint(12, "Jul")); lineSeries.DataPoints.Add(new CategoricalDataPoint(19, "Oct")); this.radChartView1.Series.Add(lineSeries); LineSeries lineSeries2 = new LineSeries(); lineSeries2.DataPoints.Add(new CategoricalDataPoint(3, "Jan")); lineSeries2.DataPoints.Add(new CategoricalDataPoint(1, "Apr")); lineSeries2.DataPoints.Add(new CategoricalDataPoint(5, "Jul")); lineSeries2.DataPoints.Add(new CategoricalDataPoint(2, "Oct")); this.radChartView1.Series.Add(lineSeries2); } private void radButton1_Click(object sender, EventArgs e) { this.radRangeSelector1.Height = 100; //this.ScaleVerticallyChart(this.chartElement.View, .55); } } Workaround: zoom out along the Y axis the hosted chart element and pan the view so that all series are visible private void radButton1_Click(object sender, EventArgs e) { this.radRangeSelector1.Height = 100; this.ScaleVerticallyChart(this.chartElement.View, this.radRangeSelector1.Height / (float)150); } private void ScaleVerticallyChart(ChartView view, double verticalScaleFactor) { FieldInfo fiPan = view.GetType().GetField("pan", BindingFlags.NonPublic | BindingFlags.Instance); RadPoint pan = (RadPoint)fiPan.GetValue(view); FieldInfo fiZoom = view.GetType().GetField("zoom", BindingFlags.NonPublic | BindingFlags.Instance); RadSize zoom = (RadSize)fiZoom.GetValue(view); double verticalPan = pan.Y * verticalScaleFactor / zoom.Height; CartesianArea area = view.GetArea<CartesianArea>(); if (area != null) { MethodInfo mi = area.GetType().GetMethod("GetCartesianClipRect", BindingFlags.NonPublic | BindingFlags.Instance); RectangleF rect = (RectangleF)mi.Invoke(area, new object[] { }); SizeF areaSize = rect.Size; verticalPan += areaSize.Height - (areaSize.Height * verticalScaleFactor + verticalPan); } zoom = new RadSize(1, verticalScaleFactor); fiZoom.SetValue(view, zoom); view.Layout(); }
If a RadChartView is set as the associated object of a RadRangeSelector and then is data bound the range selector does not render the chart in its inner element. How to reproduce: public partial class Form2 : Form { public Form2() { InitializeComponent(); this.radRangeSelector1.AssociatedControl = this.radChartView1; } BindingList<MyCustomObject> myList; protected override void OnLoad(EventArgs e) { base.OnLoad(e); myList = new BindingList<MyCustomObject>(); myList = new BindingList<MyCustomObject>(); myList.Add(new MyCustomObject(1, "Outdoor")); myList.Add(new MyCustomObject(8, "Hardware")); myList.Add(new MyCustomObject(3, "Tools")); myList.Add(new MyCustomObject(6, "Books")); myList.Add(new MyCustomObject(2, "Appliances")); BarSeries barSeria = new BarSeries(); radChartView1.Series.Add(barSeria); barSeria.DataSource = myList; barSeria.ValueMember = "MyInt"; barSeria.CategoryMember = "MyString"; } public class MyCustomObject : INotifyPropertyChanged { private int _myInt; private string _myString; public MyCustomObject(int myInt, string myString) { _myInt = myInt; _myString = myString; } public int MyInt { get { return _myInt; } set { _myInt = value; OnPropertyChanged("MyInt"); } } public string MyString { get { return _myString; } set { _myString = value; OnPropertyChanged("MyString"); } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } } } Workaround: Set the AssociatedControl property of the range selector after binding the chart public partial class Form2 : Form { public Form2() { InitializeComponent(); } BindingList<MyCustomObject> myList; protected override void OnLoad(EventArgs e) { base.OnLoad(e); myList = new BindingList<MyCustomObject>(); myList = new BindingList<MyCustomObject>(); myList.Add(new MyCustomObject(1, "Outdoor")); myList.Add(new MyCustomObject(8, "Hardware")); myList.Add(new MyCustomObject(3, "Tools")); myList.Add(new MyCustomObject(6, "Books")); myList.Add(new MyCustomObject(2, "Appliances")); BarSeries barSeria = new BarSeries(); radChartView1.Series.Add(barSeria); barSeria.DataSource = myList; barSeria.ValueMember = "MyInt"; barSeria.CategoryMember = "MyString"; this.radRangeSelector1.AssociatedControl = this.radChartView1; } public class MyCustomObject : INotifyPropertyChanged { private int _myInt; private string _myString; public MyCustomObject(int myInt, string myString) { _myInt = myInt; _myString = myString; } public int MyInt { get { return _myInt; } set { _myInt = value; OnPropertyChanged("MyInt"); } } public string MyString { get { return _myString; } set { _myString = value; OnPropertyChanged("MyString"); } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } } }
To reproduce: Add a RadChartView and add some data. Add a RadRangeSelector and set the AssociatedControl to be the chart. On a button click set the Start and EndRange of the range selector. You will see in the chart that the range will not update. Workaround: Update the view manually: this.rangeSelector.StartRange = 30; this.rangeSelector.EndRange = 60; (this.rangeSelector.RangeSelectorElement.AssociatedElement as IRangeSelectorElement).UpdateAssociatedView();
To reproduce: Add a RadChartView and setup drilldown. Add a RadRangeSelector and associate the chart with it. Start the application and drill down, you will see that the layout of the chart is not updated accordingly. Workaround: In the Drill event handler save a value whether a drill has occured. On the MouseUp event of RadChartView update the layout of the chart: private bool drill; void Chart_Drill(object sender, DrillEventArgs e) { drill = true; } void Chart_MouseUp(object sender, MouseEventArgs e) { if (this.drill) { Application.DoEvents(); (this.rangeSelector.RangeSelectorElement.AssociatedElement as IRangeSelectorElement).UpdateAssociatedView(); } drill = false; }
currently the chart is updated on MouseUp
To reproduce: please run the sample project and follow the steps from the gif file. You will notice that the clicks you perform, the much memory is consumed which is not released.
Use attached to reproduce.
Use the following sample code to reproduce the issue: LineSeries series = new LineSeries(); series.ValueMember = "Value"; series.CategoryMember = "Category"; this.radChartView1.Series.Add(series); DataTable table = new DataTable(); table.Columns.Add("Category", typeof(int)); table.Columns.Add("Value", typeof(int)); double value = 100; for (int i = 0; i < 1000; i++) { value += rnd.Next(-3, +4); table.Rows.Add(i, value); } series.DataSource = table; this.radRangeSelector1.AssociatedControl = this.radChartView1;
To reproduce: when you set the Orientation property to Vertical, the arrow buttons work in the opposite direction. Additionally, you change the range by using the thumbs and try to move the selection, the behavior is not expected. Please refer to the attached gif file.
Use attached to reproduce.