Зараз обговорюють

"Тобто є ряд завдань, які взагалі без рекурсії не наважуються."  - це як розуміти? Перефразуй, будь ласка. 

виправив, йшлося про те що деякі завдання можна вирішити лише при використанні рекурсії

Спасибі дуже корисна стаття

А ще щось планується подібного найближчим часом?


Дякую за підтримку, радий що Вам сподобалось!

Так маю вже майже дороблений проект по управлінні Audio файлом, на заміну стандартним клавішам управління HTML5, але ще не встиг відтестувати програвання файлів з інтернету, поки лише локально працює

Надіюсь найближчим часом дороблю й закину

Рахунки

webmoneyeur - E385818210641
usd - Z304643423050
uah - U354026817492
rub - R301704373231easypay80002677bitcoin1F5HRGroUtEQW9HBNbeew8iKh5KQ8vJxzw

Зворотній зв'язок

Для покращення роботи сайту надсилайте свої зауваження:
mailЗауваження
mailПропозиція

Статистика

UkrNET - поисково-информационный ресурс

C# : Робота із елементом DataGridView

DataGridView - це елемент управління, який дозволяє виводити дані в табличній формі

В даній статті розглянемо:

- Наповнення та видалення даних

- Доступ до даних таблиці

- Подвійна буферизація, або як позбутись мерехтіння при прокрутці даних таблиці

- Експорт даних в Excel файл

- Імпорт даних із Excel файлу


Наповнення та видалення даних

Наповнення даними будемо проводити із екземпляра нашого тестового класу testData

public class testData{
	public int[] dealID = new int[] { 12054, 64879, 98798, 12054, 64879, 98798, 12054, 64879, 98798, 12054, 64879, 98798, 12054, 64879, 98798, 12054, 64879, 98798, 12054, 64879, 98798, 12054, 64879, 98798, 12054, 64879, 98798, 12054, 64879, 98798 };
	public string[] client = new string[] { "client 1", "client 2", "client 3", "client 1", "client 2", "client 3", "client 1", "client 2", "client 3", "client 1", "client 2", "client 3", "client 1", "client 2", "client 3", "client 1", "client 2", "client 3", "client 1", "client 2", "client 3", "client 1", "client 2", "client 3", "client 1", "client 2", "client 3", "client 1", "client 2", "client 3" };
	public int[] dealSum = new int[] { 549848489, 210601446, 9875498, 549848489, 210601446, 9875498, 549848489, 210601446, 9875498, 549848489, 210601446, 9875498, 549848489, 210601446, 9875498, 549848489, 210601446, 9875498, 549848489, 210601446, 9875498, 549848489, 210601446, 9875498, 549848489, 210601446, 9875498, 549848489, 210601446, 9875498 };
}

його потрібно розмістити поза межами класу форми, або в окремому файлі проекту

Заповнення даних по рядках/стовпцях

Створення потрібної кількості колонок:

dataGridView1.ColumnCount = 4;
dataGridView1.Columns[0].Name = "id";
dataGridView1.Columns[1].Name = "cliens";
dataGridView1.Columns[2].Name = "dealID";
dataGridView1.Columns[3].Name = "dealSum";

Наповнення даних по рядках:

testData myData = new testData();
for (int i = 0; i < myData.dealID.Length; i++)
{
	dataGridView1.Rows.Add(i, myData.client[i],myData.dealID[i],myData.dealSum[i]);
}

Заповнення даних через задання джерела

Як джерело даних для нашого dataGridView створимо табличний об'єкт DataTable

і формуємо саму таблицю:

public DataTable tableDGVData()
{
	DataTable workTable = new DataTable();
	string[] headerArray = new string[] { "id", "cliens", "dealID", "dealSum" }; // заголовки таблиці
	for (int i = 0; i < headerArray.Length; i++)
	{
		DataColumn column = new DataColumn(); // створюємо колонку
		if (headerArray[i].Equals("id") || headerArray[i].Equals("dealID") || headerArray[i].Equals("dealSum"))
		{
			column.DataType = typeof(int); // формат числової колонки для коректного сортування
		}
		column.ColumnName = headerArray[i];
		column.Caption = headerArray[i];
		workTable.Columns.Add(column); // додаємо колонку у таблицю
	}
	testData myData = new testData();
	DataRow workRow; // створюємо рядок
	if (myData.dealID != null)
	{
		for (int i = 0; i < myData.dealID.Length; i++)
		{
			workRow = workTable.NewRow();
			workRow[0] = i;  // значення 1 колонки і т.д.
			workRow[1] = myData.client[i];
			workRow[2] = myData.dealID[i];
			workRow[3] = myData.dealSum[i];
			workTable.Rows.Add(workRow); // додаємо рядок у таблицю
			Application.DoEvents(); // передаємо керування системі для виконання інших фонових програм
		}
	} else
	{
		MessageBox.Show("Відсутні дані за вказаними параметрами!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
		return null;
	}
	return workTable; // повертаємо створену таблицю
}

Тепер наповнимо нашу таблицю, цими даними, при відкритті форми

private void Form1_Load(object sender, EventArgs e)
{
	dataGridView1.DataSource = tableDGVData();
}

Видалення даних рядка/стовпця

щоб видалити рядок з таблиці скористаємось методом Remove

dataGridView1.Rows.Remove(dataGridView1.Rows[rowIndex]);

rowIndex - індекс рядка який необхідно видалити (індексація починається із 0)

Для видалення колонки все аналогічно, лише замінюємо Rows на Columns

dataGridView1.Columns.Remove(dataGridView1.Columns[rowIndex]);

Примітка: працює якщо дані наповненні не із певного об'єкту через DataSource

Видалення усіх даних таблиці

Щоб видалити усі дані, можна скористатись методом Clear для колонок у таблиці:

dataGridView1.Columns.Clear();

або просто змінити джерело на null

dataGridView1.DataSource = null;

Якщо ж потрібно видалити усі дані, але щоб самі колонки залишились то використовуємо Clear для рядків (при умові що таблиця наповнене не із об'єкту через DataSource)

dataGridView1.Rows.Clear();

Якщо дані отримуються із об'єкта потрібно перебачити в ному можливість повернення пустої таблички (лише заголовків)


Доступ до даних таблиці

Назва рядка/колонки даних

dataGridView1.Columns[j].HeaderText;

Отримання значення комірки

dataGridView1.Rows[i].Cells[j].Value;

де i - індекс потрібного рядка, j - індекс колонки

Примітка: відлік індексів починається із нуля


Подвійна буферизація, або як позбутись мерехтіння при прокрутці даних таблиці

Для початку нам необхідно буде підключити наступний простір імен:

using  System.Reflection;

Тепер додаємо на нашу форму (чи клас який наслідує елемент DataGridView) наступний метод який буде додавати властивість подвійної буферизації даних, що забезпечить плавний скролінг даних таблиці

public static void dgvDoubleBuffered(DataGridView dgv, bool setting)
{
    Type dgvType = dgv.GetType();
	PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
	pi.SetValue(dgv, setting, null);
}

метод приймає два аргументи:

dgv - сам елемент DataGridView яку необхідно підключити буфер

setting - вкл./викл. (true/false)

Тепер достатньо при завантаженні форми викликати метод із потрбним елементом:

private void Form1_Load(object sender, EventArgs e)
{
	dgvDoubleBuffered(dataGridView1, true);
}

Експорт даних в Excel файл

Створимо метод який буде приймати за аргумент табличний елемент який необхідно експортувати в Excel файл, зберігаючи заголовки стовпців

private void copyToExcel(DataGridView dgv)
{
	try
	{
		Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();
		Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);
		Microsoft.Office.Interop.Excel._Worksheet worksheet = workbook.Sheets[1];
		Microsoft.Office.Interop.Excel.Range oRange;
		oRange = worksheet.Range[worksheet.Cells[1, 1], worksheet.Cells[dgv.Rows.Count + 1, dgv.Columns.Count]];
		object[,] arr = new object[dgv.Rows.Count + 1, dgv.Columns.Count];
		for (int i = 0; i < dgv.Rows.Count + 1; i++)
		{
			for (int j = 0; j < dgv.Columns.Count; j++)
			{
				if(i==0)
				{
					arr[i, j] = dgv.Columns[j].HeaderText;
				} else
				{
					arr[i, j] = dgv.Rows[i - 1].Cells[j].Value;
				}
			}
		}
		oRange.Value = arr;
		app.Visible = true;
	}
	catch (Exception ex)
	{
		MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
	}
}

Примітка: для використання Excel у проекті, необхідно додати посилання на бібліотеки для роботи із додатком Excel. Зробити це можна за наступним чином -> Проект/Додати посилання в розділі COM знайти Microsoft Excel 15.0 Object Library

Використовуючи присвоєння об'єкта arr нашому діапазону oRange значно зменшуються витрати часу на заповнення аркуша даними, так як не витрачається час на почергове звертання до кожної комірки аркуша


Імпорт даних із Excel файлу

Якщо ж необхідно завантажити дані із певного Excel файлу для їх виведення у програмному вікні, можна скористатись наступним методом

private void importData(DataGridView dgv, string pathExcelFile)
{
	Microsoft.Office.Interop.Excel._Application app;
	try
	{
		app = new Microsoft.Office.Interop.Excel.Application();
		Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Open(pathExcelFile);
		Microsoft.Office.Interop.Excel._Worksheet worksheet = workbook.Sheets[1];
		Microsoft.Office.Interop.Excel.Range oRange;
		int maxRow = worksheet.Range["A1"].End[Microsoft.Office.Interop.Excel.XlDirection.xlDown].Row; // визначаємо к-ть заповнених (не перервних) даних по рядках, починаючи з 1
		int maxColumn = worksheet.Range["A1"].End[Microsoft.Office.Interop.Excel.XlDirection.xlToRight].Column; // визначаємо к-ть заповнених (не перервних) даних по стовпцях, починаючи з 1
		oRange = worksheet.Range[worksheet.Cells[1, 1], worksheet.Cells[maxRow, maxColumn]]; // оголошуємо заповнену область як діапазон
		object[,] arr = new object[maxRow, maxColumn];
		arr = oRange.Value; // передаємо дані діапазону для нашого об'єкту для подальшого опрацювання
		DataTable workTable = new DataTable();
		// приймаємо що 1-й рядок містить заголовки для стовпців
		for (int i = 1; i <= maxColumn; i++)
		{
			DataColumn column = new DataColumn();
			column.ColumnName = arr[1, i].ToString();
			column.Caption = arr[1, i].ToString();
			workTable.Columns.Add(column);
		}
		// наповняємо решту даних
		DataRow workRow;
		for (int i = 2; i <= maxRow; i++)
		{
			workRow = workTable.NewRow();
			for(int j = 1; j <= maxColumn; j++)
			{
				workRow[j-1] = arr[i, j];
			}
			workTable.Rows.Add(workRow);
			Application.DoEvents();
		}
		workbook.Close();
		app = null; // закрити процес Excel який був створений
		dataGridView1.DataSource = workTable;
	}
	catch (Exception ex)
	{
		app = null; // закрити процес Excel який був створений
		MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
	}
}

і відповідно виклик методу буде мати наступний вигляд:

importData(dataGridView1, @"D:\файл1.xlsx");

view589like0dislike0 avatard_l4w clock 2017-05-19 19:55

Коментарі:



Для даної статті відсутні коментарі

Про нас

"Programmers World" розроблено з метою полегшення в освоєнні навичок програмування, та поширення матеріалів з сфери ІТ Українською мовою.

Кожен бажаючий може безкоштовно користуватися ресурсами сайту, щоб:

- Вивчати теоретичні аспекти мов програмування

- Переглядати практичне застосування теорії при виконанні різних міні проектів з відкритим кодом

- Розміщати свої завдання на форумі для допомоги в їх реалізації, або готового коду який може бути корисний іншим користувачам

- Спілкуватись з іншими користувачами та обмінюватись досвідом

Сайт функціонує на безопланій основі та ентузіазмі розробника, якщо Ви бажаєте долучитись до розвитку даного проекту то можете пожертвувати кошти на рахунки розміщені в блоці "Допомога сайту".

Сайт

Зареєстровані користувачі можуть скористатися системою діалогів, в профілі користувача, для отримання потрібної інформації. Написати!

Також Ви можете використати форми відправки Зауважень та Пропозицій.


Електронна пошта

Ви можете звертатись на нашу поштову скриньку site.programmersworld@gmail.com

www.000webhost.com