none
C# Построение графика в окошке RRS feed

  • Вопрос

  • Всем добрый день!

    Очень нужна ваша помощь.

    Существует консольное приложение, вычисляющее значение функции f(x) = 1/x с задаваемыми пользователем промежутком и шагом.

    Далее на экран вылетает окошко с результатами в виде таблицы

    1) Необходимо в этом же окошке разместить кнопочку "построить график", при нажатии которой по введенным данным сами понимаете, что происходит.

    2) как сделать это -> : создать отдельно окошко Windows Forms, сделать там табличку, полосу прокрутки с данными и ОРГАНИЗОВАТЬ вызов созданного окна из мэйна консольного приложения?

    Заранее спасибо.

Ответы

  • Если Вы работаете с WinForm, то нужно пользоваться DataGridView, DataSet и DataView.
    А Вы, по-видимому, пытаетесь работать с System.Windows.Controls.ListView
    для проекта типа WPF.

    Вот код, посмотрите, должно помочь.
    Это мой очень давний пробный пример - наверное что-то можно рационализировать, но работает.

    1. Создать новый WinForm - проект 
    2. Открыть Program.cs, удалить все, весь текст. 
    3. Открыть Form1.Designer.cs, удалить все, весь текст.
    4. Открыть Form1.cs, удалить все, весь текст, вставить туда текст следующей программы.
    5. F5. 

    using	System;
    using	System.ComponentModel;
    using	System.Data;
    using	System.Windows.Forms;
    public class	MainForm	:	Form
    {	public MainForm()	{	InitializeComponent();	SetUp();	} 
    	private	DataGridView	dgView;
    	private	DataSet		dataSet = new	DataSet		("dataSet");
    	#region WindowsFormDesign
    	private	Container	components;
    	protected override void Dispose( bool disposing )	{if	( disposing )	if (components != null) components.Dispose(); base.Dispose( disposing );	}
    	private void InitializeComponent() {
    	this.dgView = new System.Windows.Forms.DataGridView();
    	((System.ComponentModel.ISupportInitialize)(this.dgView)).BeginInit();
    	this.SuspendLayout();
    	// 
    	// dgView
    	// 
    	this.dgView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
    	this.dgView.Location = new System.Drawing.Point(3,7);
    	this.dgView.Name = "dgView";
    	this.dgView.Size = new System.Drawing.Size(241,161);
    	this.dgView.TabIndex = 3;
    	// 
    	// MainForm
    	// 
    	this.AutoScaleBaseSize = new System.Drawing.Size(5,13);
    	this.ClientSize = new System.Drawing.Size(248,171);
    	this.Controls.Add(this.dgView);
    	this.Name = "MainForm";
    	this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
    	this.Text = "DataGridView";
    	this.TopMost = true;
    	this.Load += new System.EventHandler(this.Form1_Load);
    	((System.ComponentModel.ISupportInitialize)(this.dgView)).EndInit();
    	this.ResumeLayout(false);
    
    	}
    	# endregion
    	public static	void	Main()	{	Application.Run(	new MainForm());	}
    	private	void	Form1_Load	(	object o,	EventArgs e)			{}
    	private	void	SetUp()	{	CreDataSet();	dgView.DataSource=dataSet;		dgView.DataMember="Block";		dgView.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.DisplayedCells;	}
    // Создание DataSet
    	private	void	CreDataSet()
    	{	DataTable	dataTable	= new DataTable	("Block");
    		dataSet.Tables.Add(	dataTable	);
    		DataColumn	cNpp	=	new	DataColumn	("Nnnnnn",	 typeof(int));	dataTable.Columns.Add(cNpp);
    		DataColumn	cX	=	new	DataColumn	("X",	typeof(decimal));	dataTable.Columns.Add(cX);
    		DataColumn	cY	=	new	DataColumn	("Y",	typeof(decimal));	dataTable.Columns.Add(cY);
    		DataRow		r;
    		for		(	int i = 0; i < 10000; i++	)
    		{	r	= dataTable.NewRow();	dataTable.Rows.Add	( r );
    			r["Nnnnnn"] = i;	dataTable.Rows[i]["X"] = 10*i;	dataTable.Rows[i]["Y"] = 100000*i;
    	}	}	
    }	
    

    • Помечено в качестве ответа дядя Фёдор 30 мая 2011 г. 7:40

Все ответы

  • Наилучшие, простые и профессиональные графики -
    http://code.msdn.microsoft.com/mschart/Release/ProjectReleases.aspx?ReleaseId=4418
    Здесь все - демонстрация и исходный код.
  • ответьте,пожалуйста, как ОРГАНИЗОВАТЬ вызов созданного окна из мэйна консольного приложения?
  • Никогда не озадачивался такой постановкой.
    При создании нового проекта нужно изначально определиться -
    WinForm или Консольное приложение или библиотека классов или ...
    Но если требуется из одного типа проекта переехать в другой тип,
    то нужно дополнить его всем тем, чего не хватает.
    Для этого нужно создать два проекта обоих типов и смотреть, чем отличаются.
    Но это совершенно неэффективно и безграмотно.
    Мне так кажется...

    Можно, конечно, дополнить используемые пространства строчкой -
    using System.Windows.Forms;
    а в программе  написать -
    Form F=new Form();
    и работать с формой F, добавить на нее контролы и пр.

    Может быть так?


  •  а ну можно..просто я пока не умею программно добавлять контролы..теперь не могу найти компонент zedgraph.dll для рисования графика...
  • Чтобы посмотреть, как добавляются контролы,
    нужно создать новый winform - проект,
    открыть дизайнер,
    т.е. в обозревателе решений нажать на "+" перед Form1.cs -
    открываются два пункта - Form1.Disigner.cs и Form1.resx,
    двойной клик на Designer.
    После этого в конструкторе добавить контрол и
    посмотреть в дизайнере, что произошло.

    Что такое zedgraph? По-моему, это из другой истории.

  • )) это я уже на другую тему перешел..просто узнал что для рисования простых графиков используется zedgraph..а за дизайнера отдельное спасибо))
  • Я знаю, что такое ZedGraph.dll.
    Не связывайтесь - то, что я Вам посоветовал гораздо лучше, поверьте. 
  • Скажите, как добавлять значения в разные столбцы элемента ListView ?

    Я добавляю так :

      for (int z = 0; z < X.Count; z++)

                {

                    listView1.Items.Add(X[z].ToString());

                }

     

    но он добавляет только в 1-ый столбец..как быть?

  • Что такое X?
    Вам нужно работать со списком объектов типа Point.
  • извините,не всё написал..Х - это лист со значениями х

    ну даже если и с Point,

    то как в одном столбце сделать аргументы,а в другом-их значения?

  • Если Вы работаете с WinForm, то нужно пользоваться DataGridView, DataSet и DataView.
    А Вы, по-видимому, пытаетесь работать с System.Windows.Controls.ListView
    для проекта типа WPF.

    Вот код, посмотрите, должно помочь.
    Это мой очень давний пробный пример - наверное что-то можно рационализировать, но работает.

    1. Создать новый WinForm - проект 
    2. Открыть Program.cs, удалить все, весь текст. 
    3. Открыть Form1.Designer.cs, удалить все, весь текст.
    4. Открыть Form1.cs, удалить все, весь текст, вставить туда текст следующей программы.
    5. F5. 

    using	System;
    using	System.ComponentModel;
    using	System.Data;
    using	System.Windows.Forms;
    public class	MainForm	:	Form
    {	public MainForm()	{	InitializeComponent();	SetUp();	} 
    	private	DataGridView	dgView;
    	private	DataSet		dataSet = new	DataSet		("dataSet");
    	#region WindowsFormDesign
    	private	Container	components;
    	protected override void Dispose( bool disposing )	{if	( disposing )	if (components != null) components.Dispose(); base.Dispose( disposing );	}
    	private void InitializeComponent() {
    	this.dgView = new System.Windows.Forms.DataGridView();
    	((System.ComponentModel.ISupportInitialize)(this.dgView)).BeginInit();
    	this.SuspendLayout();
    	// 
    	// dgView
    	// 
    	this.dgView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
    	this.dgView.Location = new System.Drawing.Point(3,7);
    	this.dgView.Name = "dgView";
    	this.dgView.Size = new System.Drawing.Size(241,161);
    	this.dgView.TabIndex = 3;
    	// 
    	// MainForm
    	// 
    	this.AutoScaleBaseSize = new System.Drawing.Size(5,13);
    	this.ClientSize = new System.Drawing.Size(248,171);
    	this.Controls.Add(this.dgView);
    	this.Name = "MainForm";
    	this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
    	this.Text = "DataGridView";
    	this.TopMost = true;
    	this.Load += new System.EventHandler(this.Form1_Load);
    	((System.ComponentModel.ISupportInitialize)(this.dgView)).EndInit();
    	this.ResumeLayout(false);
    
    	}
    	# endregion
    	public static	void	Main()	{	Application.Run(	new MainForm());	}
    	private	void	Form1_Load	(	object o,	EventArgs e)			{}
    	private	void	SetUp()	{	CreDataSet();	dgView.DataSource=dataSet;		dgView.DataMember="Block";		dgView.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.DisplayedCells;	}
    // Создание DataSet
    	private	void	CreDataSet()
    	{	DataTable	dataTable	= new DataTable	("Block");
    		dataSet.Tables.Add(	dataTable	);
    		DataColumn	cNpp	=	new	DataColumn	("Nnnnnn",	 typeof(int));	dataTable.Columns.Add(cNpp);
    		DataColumn	cX	=	new	DataColumn	("X",	typeof(decimal));	dataTable.Columns.Add(cX);
    		DataColumn	cY	=	new	DataColumn	("Y",	typeof(decimal));	dataTable.Columns.Add(cY);
    		DataRow		r;
    		for		(	int i = 0; i < 10000; i++	)
    		{	r	= dataTable.NewRow();	dataTable.Rows.Add	( r );
    			r["Nnnnnn"] = i;	dataTable.Rows[i]["X"] = 10*i;	dataTable.Rows[i]["Y"] = 100000*i;
    	}	}	
    }	
    

    • Помечено в качестве ответа дядя Фёдор 30 мая 2011 г. 7:40
  • QazRdx, спасибо большое за отзывчивость и понятное объяснение..

    если что, я сегодня отпишусь еще)

  • QazRdx, посмотри, пожалуйста.. ошибок нет, а ничего не происходит..
    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private void button1_Click(object sender, EventArgs e)
            {
                
                SetUp();
            }
            DataSet dataset = new DataSet("dataset");
            private void SetUp()
            {
                CreDataSet();
                dataGridView1.DataSource = dataset;
                dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
            }
            private void CreDataSet()
            {
                double a, b, h, x;
                a = double.Parse(textBox1.Text); // начало промежутка
                b = double.Parse(textBox2.Text); // конец промежутка
                h = double.Parse(textBox3.Text); // шаг
                x = a;
                List<double> X = new List<double>();
                for (double i = a; i <= b; i += h)
                {
                    X.Add(i); // заполнение листа значениями x
                }
                DataTable tab = new DataTable("table");
                dataset.Tables.Add(tab);
                DataColumn zx = new DataColumn("Значение X", typeof(double));
                tab.Columns.Add(zx);
                DataColumn zf = new DataColumn("Значение F", typeof(double));
                tab.Columns.Add(zf);
                DataRow points;
                for ( int z = 0;  z< X.Count; z++)
                {
                    points = tab.NewRow();
                    tab.Rows.Add(points);
                    points["Значение X"] = X[z];
                    tab.Rows[z]["Значение F"] = 1 / X[z];
                }
            }
        }
  • Уважаемый!
    Я предложил Вам работающую программу,
    а Вы умудрились превратить ее в неработающую.
    Вам следует внимательно разобраться и найти свои ошибки.
  • QazRdx, спасибо большое за помощь. Построил я свою таблицу, как мне нужно было.

    Теперь буду строить график.

    Я напишу еще)

  • ну всё, тему можно закрывать, у меня больше вопросов нет.

  • Для построения графика существует очень шикарные элемент Chart.

    Вот пример:

    Public Class Form2

        Public Shared Sub Chart_GISTO(ByVal MyArr2() As UInteger, ByVal H As Double, ByVal strFileOpen As String)

            'Form2.Chart1.Titles.Add("Расчеты проводились для файла: " & strFileOpen & vbNewLine & "Энтропия H = " & CStr(H))

            Form2.Chart1.DataBindTable(MyArr2)

        End Sub

     

        Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

            Chart1.ChartAreas(0).AxisX.Interval = 8

        End Sub

    6 июля 2011 г. 19:43
  • sg6336, что-то мне подсказывает, что это бэйсик. В таком случае, обратите внимание на первые два символа в названии темы.

    Да и тема уже давно закрыта. Спасибо.

  • Chart это из .Net Framwork 4

    Используйте сервис Convert C# to VB.NET

    Только выберите VB.Net to C#

    Просто привел пример исспольоования


  • Спасибо :)
    7 июля 2011 г. 20:59
  • http://i010.radikal.ru/1107/48/6f57e465211b.jpg

    вот как выглядит этот элемент в моей программе. Если форму растягивать, то он автоматически перерисовывается. Это векторное изображение ))) Очень удобно.

  • Можете скинуть код данного графика для консольного приложения?

    26 марта 2017 г. 14:32
  • Читайте внимательно, читайте утром, читайте на ночь...
    Здесь все уже сказано-пересказано...
    И в том числе представлен работающий код.
    27 марта 2017 г. 19:01