none
Определить индекс точки на графике RRS feed

  • Frage

  • Всем привет!
    С Новым годом!
    Не могу получить индекс точки.
    Может системный глюк?
    Что интересно, даже try / catch его не берет...
    VS 2019, C#.

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Windows.Forms.DataVisualization.Charting;
    namespace Histo
    {	public	partial	class	MainForm :	Form
    	{	public	SimpleChart		C;
    		public	MainForm	()
    		{	InitializeComponent();
    			C = new SimpleChart( );
    //	Показать колонковую диаграмму
    			C.Show ();
    //	Удалить точку по ее индексу - работает
    			C.chart.Series[	0].Points.RemoveAt ( 6 );
    //	Определить точку для удаления
    //			DataPoint P = new DataPoint ( 6, 6 );
    //	Определить индекс точки - не работает, Index = -1;
    //			int Index = C.chart.Series[ 0 ].Points.IndexOf ( P );	// ???	Index = -1; ???
    //	Удалить точку по ее индексу
    //			C.chart.Series[	0].Points.RemoveAt ( Index );
    	}	}
    	public	class	SimpleChart	:	Form
    	{	public	SimpleChart				()
    		{	InitializeComponent();
    			for	( int i=1;i<=20;i++)	chart.Series [0].Points.Add ( i, i );
    		}
    		public	Chart	chart;
    		public	Series	serie;
    		public	ChartArea	chartArea;
    		private	void	InitializeComponent	()
    		{	chartArea =	new ChartArea();
    			chartArea.Position.Height	=	85F;
    			chartArea.Position.Width	=	93F;
    			chartArea.Position.X	=	3F;
    			chartArea.Position.Y	=	3F;
    
    			serie	=	new Series();
    			serie.IsValueShownAsLabel	=	true;
    			serie.ChartType		=	SeriesChartType.Column;
    
    			chart	=	new Chart();
    			chart.ChartAreas.Add	(	chartArea	);
    			chart.Series.Add	(	serie	);
    			chart.Size		=	new	Size	(	420, 300	);
    			Controls.Add		(	chart	);
    
    			Location   =	new Point	(	-6,	97	);
    			Size	=	new Size	(	440, 320	);
    			StartPosition	=	FormStartPosition.Manual;
    }	}	}
    namespace Histo 
    {	partial class MainForm
    	{	private		System.ComponentModel.IContainer components = null;
    		protected override void Dispose		(	bool disposing	)
    		{	if (disposing && (components != null))	{	components.Dispose();	}
    			base.Dispose(disposing);
    		}
    		private	void	InitializeComponent()
    		{	this.SuspendLayout();
    			// 
    			// MainForm
    			// 
    			this.ClientSize = new System.Drawing.Size(284, 66);
    			this.Location = new System.Drawing.Point(-6, 0);
    			this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
    			this.Text = "MainForm";
    }	}	}	









    • Bearbeitet QazRdx Freitag, 3. Januar 2020 02:55
    Donnerstag, 2. Januar 2020 23:47

Antworten

  • Ответов нет, да и откуда им быть,
    если Microsoft каким-то непостижимым образом
    уничтожил все пояснения по DataVisualization.Charting.
    Все ссылки из моих предыдущих постов по этой тематике
    на очень простой, всеобъемлющий и понятный пример 
    использования этого инструмента с открытым кодом 
    перенаправлены непонятно куда и непонятно зачем -
    https://docs.microsoft.com/ru-ru/samples/browse/?redirectedfrom=MSDN-samples.
    Здесь в строке поиска задаю "DataVisualization.Charting",
    ответ - нет такой информации.

    Ну, ладно, ищу в интернете 
    "DataVisualization.Charting C#", получаю страницу -
    https://docs.microsoft.com/ru-ru/dotnet/api/system.windows.forms.datavisualization.charting?view=netframework-4.0
    С горем пополам нахожу там Chart.Series.Points,
    а где IndexOf, Remuve и RemuveAt ? 
    Их не существует, как впрочем и остальных методов и свойств.
    О примерах использования даже вопросов не возникает.

    Если в инструкции написано "НЕТ",
    а на самом деле "ЕСТЬ" - не верь глазам своим.

    Смотрю дальше, нужна сборка, ищу в интернете,
    откуда скачать последнюю версию -
    "System.Windows.Forms.DataVisualization.dll"
    Появлются какие-то левые страницы, с какими-то версиями,
    но мне нужна фирменная последняя версия - 
    на фирменном сайте не нашел.

    К счастью, поскольку работаю с этим давно,
    на компе у меня оказалась версия 4.8.... за 12.08.2019,
    видимо она автоматически подкачивается при виндовом апгрейде.
    Хорошо!!! Но как быть с определением индексов? - Никак!

    Опять же к счастью, в СССР-е мы научились легко
    решать все проблемы с помощью зубила, кувалды и какой-то матери...

    Теперь просто просматриваю все коллекции, 
    а их у меня несколько, на предмет поиска нужной мне точки,
    соответственно просчитываю индексы,
    какая-то дополнительная логика наворачивается...
    И все!!!

    И чего это я мучился две недели?
    Жизнь-то налаживается!
    Все как всегда просто и красиво!

    • Als Antwort markiert QazRdx Sonntag, 5. Januar 2020 09:55
    • Bearbeitet QazRdx Montag, 6. Januar 2020 15:57
    Sonntag, 5. Januar 2020 09:48
  • "С горем пополам нахожу там Chart.Series.Points,
    а где IndexOf, Remuve и RemuveAt ?"

    Points имеет тип DataPointCollection. Методы типа IndexOf наследуются от Collection: https://docs.microsoft.com/ru-ru/dotnet/api/system.collections.objectmodel.collection-1.indexof?view=netframework-4.8#System_Collections_ObjectModel_Collection_1_IndexOf__0_ В документации по Charting их и не должно быть

     "Смотрю дальше, нужна сборка, ищу в интернете,
    откуда скачать последнюю версию -
    "System.Windows.Forms.DataVisualization.dll"
    Появлются какие-то левые страницы, с какими-то версиями,
    но мне нужна фирменная последняя версия - 
    на фирменном сайте не нашел."

    Эта сборка поставляется в составе .NET Framework, который, в свою очередь, поставляется в составе Windows. Ничего скачивать не надо.

    • Als Antwort markiert QazRdx Freitag, 17. Januar 2020 13:26
    Freitag, 17. Januar 2020 03:46
  • "Но, главное, почему это не работает."

    Это - то, что закомментировано? Работа IndexOf полностью основана на том, как работает метод Equals у типа элемента коллекции. Если бы он был переопределен, чтобы осуществлять сравнение по значениям координат, это бы работало. Но, судя по вашему тесту, это не сделано, и он просто сравнивает по ссылке. Т.е. созданную вами точку (6,6) он считает другой, чем такая же точка в коллекции. Рабочий способ (один из) вы уже сами нашли - поиск с перебором. Второй, вероятно - FindByValue(6,"X"); Найденное значение будет уже из коллекции, и его можно скармливать IndexOf.


    • Bearbeitet VadimTagil Freitag, 17. Januar 2020 15:03
    • Als Antwort markiert QazRdx Freitag, 17. Januar 2020 16:03
    Freitag, 17. Januar 2020 15:01

Alle Antworten

  • Ответов нет, да и откуда им быть,
    если Microsoft каким-то непостижимым образом
    уничтожил все пояснения по DataVisualization.Charting.
    Все ссылки из моих предыдущих постов по этой тематике
    на очень простой, всеобъемлющий и понятный пример 
    использования этого инструмента с открытым кодом 
    перенаправлены непонятно куда и непонятно зачем -
    https://docs.microsoft.com/ru-ru/samples/browse/?redirectedfrom=MSDN-samples.
    Здесь в строке поиска задаю "DataVisualization.Charting",
    ответ - нет такой информации.

    Ну, ладно, ищу в интернете 
    "DataVisualization.Charting C#", получаю страницу -
    https://docs.microsoft.com/ru-ru/dotnet/api/system.windows.forms.datavisualization.charting?view=netframework-4.0
    С горем пополам нахожу там Chart.Series.Points,
    а где IndexOf, Remuve и RemuveAt ? 
    Их не существует, как впрочем и остальных методов и свойств.
    О примерах использования даже вопросов не возникает.

    Если в инструкции написано "НЕТ",
    а на самом деле "ЕСТЬ" - не верь глазам своим.

    Смотрю дальше, нужна сборка, ищу в интернете,
    откуда скачать последнюю версию -
    "System.Windows.Forms.DataVisualization.dll"
    Появлются какие-то левые страницы, с какими-то версиями,
    но мне нужна фирменная последняя версия - 
    на фирменном сайте не нашел.

    К счастью, поскольку работаю с этим давно,
    на компе у меня оказалась версия 4.8.... за 12.08.2019,
    видимо она автоматически подкачивается при виндовом апгрейде.
    Хорошо!!! Но как быть с определением индексов? - Никак!

    Опять же к счастью, в СССР-е мы научились легко
    решать все проблемы с помощью зубила, кувалды и какой-то матери...

    Теперь просто просматриваю все коллекции, 
    а их у меня несколько, на предмет поиска нужной мне точки,
    соответственно просчитываю индексы,
    какая-то дополнительная логика наворачивается...
    И все!!!

    И чего это я мучился две недели?
    Жизнь-то налаживается!
    Все как всегда просто и красиво!

    • Als Antwort markiert QazRdx Sonntag, 5. Januar 2020 09:55
    • Bearbeitet QazRdx Montag, 6. Januar 2020 15:57
    Sonntag, 5. Januar 2020 09:48
  • "С горем пополам нахожу там Chart.Series.Points,
    а где IndexOf, Remuve и RemuveAt ?"

    Points имеет тип DataPointCollection. Методы типа IndexOf наследуются от Collection: https://docs.microsoft.com/ru-ru/dotnet/api/system.collections.objectmodel.collection-1.indexof?view=netframework-4.8#System_Collections_ObjectModel_Collection_1_IndexOf__0_ В документации по Charting их и не должно быть

     "Смотрю дальше, нужна сборка, ищу в интернете,
    откуда скачать последнюю версию -
    "System.Windows.Forms.DataVisualization.dll"
    Появлются какие-то левые страницы, с какими-то версиями,
    но мне нужна фирменная последняя версия - 
    на фирменном сайте не нашел."

    Эта сборка поставляется в составе .NET Framework, который, в свою очередь, поставляется в составе Windows. Ничего скачивать не надо.

    • Als Antwort markiert QazRdx Freitag, 17. Januar 2020 13:26
    Freitag, 17. Januar 2020 03:46
  • "Points имеет тип DataPointCollection.
    Методы типа 
    IndexOf наследуются от Collection: ...
    В документации по Charting их и не должно быть".

    - Да, возможно,
    хотя раньше это расписывалось,
    ведь с остальными свойствами и методами я как-то работаю.
    Но, главное, почему это не работает.
    Почему в реальной рабочей коллекции 
    IndexOf дает "-1"?
    Видимо это глюк.

    "Эта сборка поставляется в составе .NET Framework,
    который, в свою очередь, поставляется в составе Windows.
    Ничего скачивать не надо."

    Понятно. Спасибо!

    Кстати, вот описание 
    System.Windows.Forms.DataVisualization.Charting.
    Но примеров использования,
    тех, что были раньше, пока не нашел.
    • Bearbeitet QazRdx Freitag, 17. Januar 2020 13:32
    Freitag, 17. Januar 2020 13:25
  • "Но, главное, почему это не работает."

    Это - то, что закомментировано? Работа IndexOf полностью основана на том, как работает метод Equals у типа элемента коллекции. Если бы он был переопределен, чтобы осуществлять сравнение по значениям координат, это бы работало. Но, судя по вашему тесту, это не сделано, и он просто сравнивает по ссылке. Т.е. созданную вами точку (6,6) он считает другой, чем такая же точка в коллекции. Рабочий способ (один из) вы уже сами нашли - поиск с перебором. Второй, вероятно - FindByValue(6,"X"); Найденное значение будет уже из коллекции, и его можно скармливать IndexOf.


    • Bearbeitet VadimTagil Freitag, 17. Januar 2020 15:03
    • Als Antwort markiert QazRdx Freitag, 17. Januar 2020 16:03
    Freitag, 17. Januar 2020 15:01
  • Да, действительно!
    Т.е. все созданные точки имеют одну
    и ту же ординату X = 0;
    Да, но рисуется это
    вполне красиво.
    А должно бы, по идее, в виде 
    серии точек над X = 0;
    Мир полон чудес!
    Одно радует, что это не глюк, а MS все еще на плаву. 
    • Bearbeitet QazRdx Freitag, 17. Januar 2020 16:02
    Freitag, 17. Januar 2020 16:01
  • Вероятно, координаты (X;Y) для графика (который линией), а для столбчатой диаграммы координаты X по сути не нужны, достаточно Y (высоты столбца). Горизонтальная координата подбирается автоматически, чтобы столбцы были рядом друг с другом. 
    Freitag, 17. Januar 2020 16:57
  • И все-таки не понятно, что же это за структура такая?

    После формирования массива точек
    chart.Series [0].Points
    выглядит следующим образом -
    [0] X=0, Y = [1,1]
    [1] X=0, Y = [2,2]
    [2] X=0, Y = [3,3]
    [3] X=0, Y = [4,4]
    ...
    [19] X=0, Y = [20,20]

    chart.Series [1].Points 
    выглядит аналогично.

    Что такое X и почему X всегда равен нулю?
    Как этому X присвоить что-нибудь другое, например 1?

    • Bearbeitet QazRdx Freitag, 17. Januar 2020 18:15
    Freitag, 17. Januar 2020 17:58
  • chart.Series[0].Points.AddXY(1,1);
    Freitag, 17. Januar 2020 18:03
  • Да, действительно!
    Спасибо!
    Не понятно только,
    зачем нужна структура типа
    X=0, Y = [1,1]
    X=0, Y = [2,2]
    ...
    Freitag, 17. Januar 2020 18:27