Массив в windows forms c

Лекция
15

22.0. Массивы в
Windows Forms Application

Массивы – это структура данных,
представляющая собой набор переменных
одинакового типа, имеющих общее имя.

Каждый
элемент массива однозначно определяется
именем и индексом (номером элемента в
массиве). Индексы массива принадлежат
целочисленному типу.

Все
элементы массива имеют одинаковый тип.

Используются
при работе с таблицами и списками.

Массив
может быть:


одномерным,


двумерным /многомерным.

Массивы
различают:

  • статические
    и

  • динамические.

В статическом массиве размеры
массива (верхний индекс элементов)
задаются при объявлении массива (размеры
известны до компиляции программы).

Формат
объявления одномерного массива в C#:

тип[
] ИмяМассива = new
тип [размер];

Формат
объявления двумерного массива в C#:

тип
[ , ] ИмяМассива = new
тип [количество строк, количество
столбцов];

Если массив объявлен с инициализацией
глобально в программе, то начальные
значения элементов массива будут
использоваться во всех процедурах и
обработчиках событий. Пример объявления
массива:

// using – раздел
объявления модулей;

using
System.Windows.Forms;

namespace
WindowsFormsApplication1 //пространство
имен приложения

{

public
partial class Form1 : Form // объявление
класса

{

public Form1()
// объявление формы1

{

InitializeComponent();
// объявление компонент на форме

}

// глобальное объявление массивов

int[] А = new int[5]; // одномерный массив
А из 5 целых чисел

double[,] M = new double[2, 3]; // двумерный массив
M[2х3]

string[ ] Team = {«Zenith»,
«Dynamo», «Sparta», «Rotor», «CSK»};
//строковый

double[] F = { 1.5, 2.1, 3.65, 4.7, 5.14, 6.36 }; // F[6]
из 6 вещественных чисел

int[,] D = { { 0, 2, 4, 6 }, { 2, 9, 6, 3 }, { 4, 7, 5, 8 }, { 1, 6,
5, 7 } }; // массив M [4х4]

}

}

// обработчики событий

Элементы
массива, объявленного глобально
можно инициализировать в процедуре
обработчика события, во время работы
программы, например, для массива A из 5
эл.:

private void
button1_Click(object sender, EventArgs e)

{

// инициализация элементов массива
A, объявленного глобально

A[1] = 5;
A[2] = 6; A[3] = 0; A[4] = -5; A[5]
= -10;

}

Локальный массив объявляется в
процедуре обработчика события, и тогда
его как правило инициализируют во время
исполнения этого события. Значения
элементов, как и сам массив известен
только в этой процедуре. При необходимости
работы с массивом его надо заново
объявлять в другом обработчике события
и производить его инициализацию.
Например:

private
void button2_Click(object sender, EventArgs e)

{

int[] B =
new int[10];
// массив B объявлен
локально

for (int k
= 0; k <= 4; k++)
// с инициализацией элементов

B[k] = k;

}

При обращении к элементам массива
заданного локально в другом обработчике
событий, будет выдано сообщение об
ошибке:

В динамическом массиве при объявлении
указывается имя массива, тип его
элементов, а размер массива определяется
при выполнении программы и задается
некой переменной. Значение переменной
можно ввести в процессе диалога программы
с пользователем или используя свойство
length, содержащее количество элементов,
которое может хранить массив. Например:

private void button1_Click(object sender, EventArgs e)

{

int size = int.Parse(textBox1.Text);
//Задание верхней
границы массива

int []
H = new int[size];

………

}

22.1 Операции с массивами в Windows-приложениях

Типовые операции:

  • вывод/ввод
    массива;

  • поиск
    максимального или минимального элемента
    массива;

  • поиск
    заданного элемента массива;

  • сортировка
    массива.

Ввод-Вывод
массивов в
Windows-приложениях

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

Пример. Форма разделена условно на две
части – для ввода и вывода массива.

Пользователь в текстовое окно число
элементов массива и нажимает командную
кнопку «Создать массив», обработчик
которой создает массив заданной
размерности, если корректно задан
размер, в противном случае выдается
сообщение об ошибки.

Затем пользователь переходит к вводу
элементов массива. Элемент вводится в
текстовое окно, а командная кнопка
«Ввести элемент» обеспечивает передачу
значения в массив. Корректность ввода
контролируется и на этом этапе.

Для облегчения ввода пользователю
выводится подсказка, какой именно
элемент надо ввести. После ввода элементов
массива окно ввода становится недоступным
для ввода элементов.

В нижней части отображается введенный
массив в форме, удобной для восприятия
пользователя. Для этого пригодны
элементы: ListBox, CheckedListBox,
ComboBox. Как только вводится
очередной элемент, он немедленно
отображается во всех объектах.


ComboBox11

label1

label2

label3

label4

label5

label6

label7

listBox1-
список

checkedListBox1

comboBox1-
комбинированный список


textBox1

button1

textBox2

button2

panel1

panel2

Три объекта вывода элементов массива
приведены для демонстрации, реально их
всех отображать не нужно. Компонент
выбирается по желанию пользователя.


using System;

using
System.Collections.Generic;

using
System.ComponentModel;

using System.Data;

using System.Drawing;

using
System.Linq;

using System.Text;

using
System.Windows.Forms;

namespace
WindowsFormsApplication1

{

public partial
class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

double [] mas;

int i=0;

private void
button1_Click(object sender, EventArgs e)

{

try //охраняемый блок


{

int n = int.Parse(textBox1.Text);

mas =
new double[n];

label4.Text = «mas[ » + 0 + » ]»;

textBox2.ReadOnly = false;

listBox1.Items.Clear();

checkedListBox1.Items.Clear();

comboBox1.Items.Clear();

i = 0;

}

catch //перехватчик исключения и
формирование ошибки

{

MessageBox.Show(«Надо вводить цифры «,
«Ошибочный ввод данных»,
MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

private void
button2_Click(object sender, EventArgs e)

{

int n =
int.Parse(textBox1.Text);

mas = new
double[n];
// задание размера массива

mas[i] = double.Parse(textBox2.Text);


label4.Text = «mas[ » + i + » ]»;

listBox1.Items.Add(mas[i]);

checkedListBox1.Items.Add(mas[i]);

comboBox1.Items.Add(mas[i]);

i++;

textBox2.Text = » «;

label6.Text = «ОК»;

if (i == n)

{

label3.Text = » «;

label4.Text = » «;

label6.Text = «Ввод
не доступен
«;

textBox2.Text = » «;

textBox2.ReadOnly = true;

}

}

}

}

Последовательность чисел удобно вводить
в строку таблицы с помощью компонента
DataGridView (данные строкового
вида).

DataGridView – это таблица,
ячейки которой содержат строки символов.


Столбец

Таблица


Строка

Ячейка


Свойства
DataGridView определяют:

Columns
колонки таблицы

Rows
строки таблицы

Cells ячейки

ColumnCount количество
столбцов таблицы

RowCount количество
строк таблицы

Rows[n].Cells[k]
ячейка, лежащая на пересечении n
— го ряда row и k-ой
столбца

Задача1, 2. Ввести
элементы одномерного
массива и вычислить:

Задача1: суммарное, среднеарифметическое,

Задача2: максимальное и минимальное
значения элементов этого массива.

using System;

using
System.Collections.Generic;

using
System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using
System.Windows.Forms;

namespace
WindowsFormsApplication1

{

public partial
class Form1 : Form

{

public Form1()

{

InitializeComponent();
// объявление компонентов на
Form1

}

double[] K =
new double[5]; // объявление
массива

private void
button1_Click(object sender, EventArgs e) // Задача1

{

double avr = 0;
//среднее значение

double summ = 0; //сумма элементов

int n
= 0;
// количество введенных
элементов

try //охраняемый блок

{

for
(int
i
= 0; i
< 5; i++)
//преобразование данных, вводимых в
1 строку

{
// с клавиатуры в цифровой
эквивалент

K[i]
= System.Convert.ToDouble(dataGridView1.Rows[0].Cells[i].Value);

summ
= summ + K[i];

n= n
+ 1;

}

avr =
summ / n;

label1.Text
= «Сумма
элементов:
» + String.Format(«{0,6:f}», summ);

label2.Text
= «Среднее
арифмет.
значение:
» + String.Format(«{0,6:f3}», avr);

}

catch //перехватчик исключения и
формирование ошибки

{

MessageBox.Show(«Надо вводить цифры «,
«Ошибочный ввод данных»,
MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

private void
button2_Click(object sender, EventArgs e) // Задача2

{

double Kmax
= 0;

double Kmin
= 0;

int Nmx =
0;

int Nmn =
0;

try
//охраняемый
блок

{

for
(int
i
= 0; i
< 5; i++)
//преобразование данных, вводимых в
первую строку

{
//с клавиатуры в цифровой эквивалент

K[i]
= System.Convert.ToDouble(dataGridView1.Rows[0].Cells[i].Value);

}

Kmax =
K[0]; // предположение

Nmx =
0;

for
(int i = 1;
i < 5; i++)

{

if (K[i] > Kmax)

{

Kmax
= K[i]; // выявление
max

Nmx = i;

}

}

Kmin =
K[0]; // предположение

Nmn =
0;

for
(int i =1;
i < 5; i++)

{

if
(K[i] < Kmin)

{

Kmin
= K[i]; // выявление
min

Nmn = i;

}

}

label3.Text
= «Максимальное
значение:
» + String.Format(«{0,6:f1}», Kmax) + «, его
номер:
» + Nmx.ToString();

label4.Text
= «Минимальное
значение:
» + String.Format(«{0,6:f1}», Kmin) + «, его
номер:
» + Nmn.ToString();

}

catch //перехватчик исключения и
формирование ошибки

{

MessageBox.Show(«Надо вводить цифры «,
«Ошибочный ввод данных»,
MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

}

}

0
1 2 3 4

Двумерную
таблицу можно представить как совокупность
одномерных массивов.

Задача
3
. Обработать результаты спортивных
соревнований олимпиады.

Программа
должна вычислять общее количество
медалей каждой страны и соответствующее
количество баллов, по правилу:

— за
золотую медаль – 7 баллов,

— за
серебряную медаль – 6 баллов,

— за
бронзовую медаль – 5 баллов,

Устанавливаем на
форму объекты dataGridView1
и button1. Используя свойство
Colomns, создаем коллекцию
столбцов с полями: Страна, Золотых,
Серебряных, Бронзовых, Всего, Баллов


dataGridView

Изменив свойство Name,
переименуем dataGridView в
Tabl.

Количество строк в компоненте
по умолчанию dataGridView
= 1 и для увеличения их численности
необходимо при инициализации элементов
добавить нужное их число через метод
dataGridView.Rows.Add();

public
Form1()

{

InitializeComponent();

Tabl.Rows.Add(8);
//добавление
строк
в
таблицу

}

Заполнение ячеек организовано через
процедуру обработки события Activate,
которое происходит при активизации
формы.

Запуск приложения

При нажатии на кнопку «Итоги» происходит
расчет показателей:

using System;

using
System.Windows.Forms;

namespace
WindowsFormsApplication1

{

public partial
class Form1 : Form

{

public Form1()

{

InitializeComponent();

Tabl.Rows.Add(8);
//добавление
строк
в
таблицу

}

private void
Form1_Activated(object sender, EventArgs e) //при
активизации
формы

{

string[]
Ctrana
= new
string[8]
{ «Австрия», «Великобритания»,
«Германия», «Италия»,

«Россия», «США»,
«Франция», «Япония» };

int[]
Zoloto
= new
int[8]
{ 16, 11, 14, 13, 32, 39, 13, 5 };

int[]
Serebro = new int[8] { 25, 10, 17, 8, 28, 25, 14, 8 };

int[]
Bronza = new int[8] { 17, 7, 28, 13, 28, 33, 11, 5 };

for (int i
= 0; i < 8; i++)

{

Tabl.Rows[i].Cells[0].Value
= Ctrana[i]; // заполнение
элементами
0 столбца

Tabl.Rows[i].Cells[1].Value
= Zoloto[i]; // заполнение
элементами
1 столбца

Tabl.Rows[i].Cells[2].Value
= Serebro[i]; // заполнение
элементами
2 столбца

Tabl.Rows[i].Cells[3].Value
= Bronza[i]; // заполнение
элементами
3 столбца

}

}

private void
button1_Click(object sender, EventArgs e) //кнопка
Итоги

{

int c,r; //номер
колонки и строки Tabl

int s=0; //всего медалей у команды

int b=0; //всего баллов у команды

for (r = 0; r < 8; r++)
//цикл по строкам

{

//вычисление
общего количества медалей

for (c
= 1; c <= 3; c++)

s =
s + System.Convert.ToInt16(Tabl.Rows[r].Cells[c].Value);

//вычисление
общего
количества
баллов

b = 7 *
System.Convert.ToInt16(Tabl.Rows[r].Cells[1].Value) +

6
* System.Convert.ToInt16(Tabl.Rows[r].Cells[2].Value) +

5
* System.Convert.ToInt16(Tabl.Rows[r].Cells[3].Value);

Tabl.Rows[r].Cells[4].Value
= s.ToString(); // всего
медалей
для
каждой
страны

Tabl.Rows[r].Cells[5].Value
= b.ToString(); // всего
баллов
для
каждой
страны

}

}

}

}

Соседние файлы в папке ЛК

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

JaktensTid

2 / 2 / 0

Регистрация: 18.09.2014

Сообщений: 107

1

Как ввести массив в формах

16.11.2014, 14:36. Показов 4280. Ответов 5

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Имеется, скажем, массив

C#
1
public static int[] x = new int[n];

С помощью какого компонента и как можно ввести данные в этот массив?

Добавлено через 21 минуту
Насколько я понял, что можно с помощью datagrid это провернуть, но как?



0



Эксперт .NET

5495 / 4264 / 1212

Регистрация: 12.10.2013

Сообщений: 12,270

Записей в блоге: 2

16.11.2014, 14:39

2

Цитата
Сообщение от JaktensTid
Посмотреть сообщение

я понял, что можно с помощью datagrid это провернуть, но как?

JaktensTid, очень просто.
Создаем таблицу из одной строки и количества колонок, равного количеству элементов массива. Заполняем таблицу и выводим ее через грид. Profit!



0



JaktensTid

2 / 2 / 0

Регистрация: 18.09.2014

Сообщений: 107

16.11.2014, 15:36

 [ТС]

3

можно поподробнее?

Добавлено через 47 минут
Таким образом можно?

C#
1
2
3
4
5
6
7
8
private void Calculate_Click(object sender, EventArgs e)
        {
            for( ; New.n <= New.x.Length; New.n = ++New.n)
            {
                New.x[New.n] = Convert.ToInt32(this.dataGridView1.CurrentCell.Value);
            }
             
        }



0



insite2012

Эксперт .NET

5495 / 4264 / 1212

Регистрация: 12.10.2013

Сообщений: 12,270

Записей в блоге: 2

16.11.2014, 17:12

4

Лучший ответ Сообщение было отмечено JaktensTid как решение

Решение

Цитата
Сообщение от JaktensTid
Посмотреть сообщение

Таким образом можно?

Таким-не знаю… Но вот так точно можно.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication29 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent(); this.Load += new EventHandler(Form1_Load);
        }
 
        void Form1_Load(object sender, EventArgs e) {
            object[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
            DataTable dt = new DataTable();
            for (int i = 0; i < arr.Length; i++) {
                dt.Columns.Add(new DataColumn());
            }
            DataRow row = dt.NewRow();
            row.ItemArray = arr;
            dt.Rows.Add(row);
            dataGridView1.DataSource = dt;
        }
    }
}



1



0 / 0 / 1

Регистрация: 16.11.2016

Сообщений: 135

08.02.2017, 13:24

5

А как сделать так, чтобы самому вводить значения в dataGridView?



0



2 / 2 / 0

Регистрация: 18.09.2014

Сообщений: 107

08.02.2017, 15:54

 [ТС]

6

Вроде бы как в свойствах datagridview можно указать, что он editable



0



Loops 

Programming often requires repeated execution of a given sequence of operations. Loop is a basic programming design that allows multiple execution of a source code snippet. Depending on the type of the loop, the program code in it is repeated either a fixed number of times or while a condition is in effect.

A loop that never ends is called an infinite loop. The use of an infinite loop is rarely required except in cases where the break operator is used in the body of the cycle to stop its execution prematurely. Let’s take a look at the Cycle constructs in the C# language.

While loop

The simplest and most used loop. Code structure and block scheme are as shown:

while (condition)
{
    Loop body;
}

For the while loop, the boolean expression (condition) is first calculated and if the result is true, the sequence of operations in the body of the loop is performed. Then the input condition is checked again and, if true, the body of the cycle is again performed. All this is repeated over and over again until at some point the conditional statement returns false. At this point, the loop ends and the program continues from the next row immediately after the loop.

Do-While loop

It is similar to the While loop, except that the boolean condition is checked after the loop runs. This type of loop is called a post-test loop. A do-while loop looks like this:

do
{
    Loop body;
}
while (condition);

The body of the loop is initially executed. Then condition is checked. If it is true, the body of the loop is repeated, otherwise the loop ends. This logic is repeated until the loop condition is violated. The body of the loop is repeated at least once. If the loop condition is always true, the loop will never end.

The Do-While loop is used when you need to ensure that the sequence of operations in it is executed repeatedly and at least once at the beginning of the loop.

For loop

These loops are a bit more complicated than the While and Do-While loops, but they can solve more complicated tasks with less code. 

Logic scheme is shown on the picture.

for (initialization; condition; counter refresh)
{
    Loop body;
}

Since none of the listed elements of the for-loop is mandatory, all of them can skipped and an infinite loop will be created:

for ( ; ; )
{
    Loop body;
}

For loop – initialization

for (int num = 0; ...; ...)
{
    // num variable can be accessed only inside the for loop
}
// outside the num variable cannot be accessed and used

Initialization runs only once, just before entering the loop. Typically, the initialization block is used to declare the variable-counter (also called the leading variable) and set its default value. This variable is «visible» and can only be used within the loop. It is possible for the initialization block to declare and initialize more than one variable.

For loop – condition

for (int num = 0; num< 10; ...)
{
    Loop body;
}

The loop condition is performed once before each iteration of the loop, just as with the while loops. When the result is true, the loop body is executed, and when false it is skipped and the loop ends (passes to the rest of the program immediately after the loop).

For loop – refreshing counter

for (int num = 0; num< 10; num++)
{
    Loop body;
}

This code is executed after each iteration after the completion of the loop body. It is most often used to update the counter value.

For loop – loop body

The body of the loop contains an arbitrary block of source code. It contains the leading variables declared in the initialization block of the cycle.

Foreach loop

This loop serves to crawl all elements of an array, list, or other collection of elements.

Here’s how one foreach loop looks like:

foreach (variable in collection)
{
    statements;
}

It is preferred by programmers because it saves writing code when required to craw all elements of specific collection.

Break operator

It is used to prematurely exit a loop before it completes its execution in its natural way. When break operator occurs, the loop is terminated and the execution of the program continues from the next row immediately after the body of the loop. The termination of a loop with the break operator can only occur from his body when it is executed in the iteration of the loop. When a break is executed, the code after it in the body of the loop is skipped and not executed.

Continue operator

The operator stops the current iteration of the innermost loop without escaping from it.

Array

The arrays are an integral part of most programming languages. They represent sets of variables that are called elements:

The array elements in C# are numbered 0, 1, 2, … N-1. These element numbers are called indexes. The number of elements in an array is called the array length.

All elements of an array are of the same type, whether primitive or reference. This helps to present a group of homogeneous elements such as ordered sequenced sequence and to process as a whole.

The arrays can be of different sizes, the one-dimensional and two-dimensional arrays are being the most common. One-dimensional arrays are also called vectors, and two-dimensional arrays – matrix.

List<T>

List<T> is the template version of ArrayList. When initializing a List<T> object, you specify the type of items that the list will contain; replace T-type markings with some real type of data (such as a number or string). The List class is represented in memory as an array, one of which holds its elements, and the rest is free and is kept as a backup. Thanks to the spare empty elements in the array, the addition operation almost always manages to add the new element without expanding the array. Sometimes, of course, resizing is required, but since each resizing doubles the size of the array, it happens so rarely that it can be ignored against the background of the number of additions.

Sample tasks

1) Create Windows Forms application which demonstrates all types of loops.

Solution:

Create new Windows Forms Application project and design the form as show on the picture:

Name the controls as follows:

— ListBox – lbResult;

— Button „For” – bFor;

— Button „While“ – bWhile;

— Button „Endless“ – bEndless;

— Button „Do“ – bDo;

— Button „Nested“ – bNested;

— Button „Foreach“ – bForeach;

— Button „Graphic1“ – bGraphic1;

— Button „Graphic2“ – bGraphic2.

Replace the content of the source code file with the following:

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace Loops
{
    public partial class Form1 : Form
    {
        int number, P, x1, y1, hlf;
        string S;
        bool bGraph1Clicked =false;
        bool bGraph2Clicked = false;

        Pen myPen = new Pen(Color.Cyan, 3);
        
        public Form1()
        {
            InitializeComponent();
        }

        private void bFor_Click(object sender, EventArgs e)
        {
            lbResult.Items.Clear();

            lbResult.Items.Add("For loop with step 1:");

            for (number = 0; number <= 5; number++)
                lbResult.Items.Add(number);

            lbResult.Items.Add("For loop with step 5:");

            for (number = 0; number <= 25; number += 5)
                lbResult.Items.Add(number);
        }

        private void bWhile_Click(object sender, EventArgs e)
        {
            lbResult.Items.Clear();

            number = 1;

            lbResult.Items.Add("Powers of 2:");

            while (number <= 1000)
            {
                number *= 2;
                lbResult.Items.Add(number);
            }
        }

        private void bEndless_Click(object sender, EventArgs e)
        {
            lbResult.Items.Clear();

            for (; ; )
                lbResult.Items.Add("Endless loop...");
        }

        private void bDo_Click(object sender, EventArgs e)
        {
            lbResult.Items.Clear();

            number = 10;

            do
            {
                lbResult.Items.Add(number);
                number =- number;
            }
            while (number == 0);
        }

        private void bNested_Click(object sender, EventArgs e)
        {
            lbResult.Items.Clear();

            for (number = 1; number <= 10; number++)
            {
                S = " " + number + " : ";
                for (P = 2; P <= 4; P++)
                    S = S + Math.Pow(number, P) + " ";
                lbResult.Items.Add(S);
            }
        }

        private void bForeach_Click(object sender, EventArgs e)
        {
            lbResult.Items.Clear();

            string[] pets = { "dog", "cat", "bird" };

            foreach (string value in pets)
            {
                lbResult.Items.Add(value);
            }
        }

        private void InitDrawingTools(PaintEventArgs e)
        {
            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;

            myPen.DashStyle = DashStyle.Solid;
            myPen.Color = Color.DarkMagenta;
            myPen.Width = 1;
        }

        private void DrawCircle(int x, int y, int width, int height, Pen myPen, PaintEventArgs e)
        {
            e.Graphics.DrawEllipse(myPen, x, y, width, height);
        }

        private void bGraphic1_Click(object sender, EventArgs e)
        {
            bGraph1Clicked = true;
            this.Refresh();
        }

        private void bGraphic2_Click(object sender, EventArgs e)
        {
            bGraph2Clicked = true;
            this.Refresh();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            InitDrawingTools(e);

            if (bGraph1Clicked)
            {
                x1 = 260;
                y1 = 40;

                for (number = 1; number <= 25; number = number + 5)
                    DrawCircle(x1, y1, number, number, myPen, e);
            }

            if (bGraph2Clicked)
            {
                x1 = 260;
                y1 = 100;

                for (number = 2; number <= 26; number = number + 4)
                {
                    hlf = number / 2;
                    DrawCircle(x1 - hlf, y1 - hlf, number, number, myPen, e);
                }
            }
        }
    }
}

2) Crete Windows Forms application with the following functionalities:

  • Draw numbers from 1 to 10 with words on English and Bulgarian; 
  • Create a button that, when pressed, alternates colors pre-set in an array, for a background of the form 
  • A ComboBox control to be used to also loads predefined colors in an array to change the color of the shape. 
  • Set the number of days in the months in an array and use a DateTimePicker control to indicate how many days have passed since the beginning of the year to the selected day. 

Solution:

Create new Windows Forms Application project and design the form as shown in the picture:

Name the controls as follows:

— Button „Initialize“ – bInitialize

— Button „Change Form Color“ – bChangeFormColor

— Button „Add Color“ – bAddColor

— ComboBox control – cbColors

— DateTimePicker control – dateTimePicker1

— TextBox control – tbDateTime

Replace the content of Form1.cs with the following:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace Arrays
{
    public partial class Form1 : Form
    {
        int number, x1, y1, widht, height;
        int colorCount = 0;

        string[] EnglishNumbers;
        string[] BulgarianNumbers;
        string[] EnglishColors;

        int[] Days = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
        
        Color[] Colors;
        Color[] EnglishColor;

        List<Color> colorList = new List<Color>();

        bool bInitializeClicked = false;
        bool bAddColorClicked = false;

        SolidBrush myBrushDrawText = new SolidBrush(Color.DarkCyan);
        Font drawFont = new Font("Courier New", 10, FontStyle.Bold);
        string drawString = "";

        Pen myPen = new Pen(Color.Black, 2);

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            EnglishNumbers = new string[11];
            EnglishNumbers[0] = "zero";
            EnglishNumbers[1] = "one";
            EnglishNumbers[2] = "two";
            EnglishNumbers[3] = "three";
            EnglishNumbers[4] = "four";
            EnglishNumbers[5] = "five";
            EnglishNumbers[6] = "six";
            EnglishNumbers[7] = "seven";
            EnglishNumbers[8] = "eight";
            EnglishNumbers[9] = "nine";
            EnglishNumbers[10] = "ten";

            BulgarianNumbers = new string[11] {"нула", "едно", "две", "три", "четири", "пет", "шест", "седем", "осем", "девет", "десет"};

            Colors = new Color[3];
            Colors[0] = Color.Red;
            Colors[1] = Color.Brown;
            Colors[2] = Color.Green;

            EnglishColorsFunc();
        }

        private void EnglishColorsFunc()
        {
            EnglishColors = new string[4] {"Red", "Yellow", "Blue", "Green"};
            EnglishColor=new Color[4] {Color.Red, Color.Yellow, Color.Blue, Color.Green};

            cbColors.Text = "Select color:";

            for (number = 0; number < 4; number++)
                cbColors.Items.Add(EnglishColors[number]);
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            if (bInitializeClicked)
                StringInitialize(e);

            if (bAddColorClicked)
                DisplayColors(e);
        }

        private void DrawStrings(string drawString, Font drawFont, Brush myBrushDrawText, int x, int y, PaintEventArgs e)
        {
            e.Graphics.DrawString(drawString, drawFont, myBrushDrawText, x, y);
        }

        private void DrawEllipse(int x1, int y1, int width, int height, Pen myPen, PaintEventArgs e)
        {
            e.Graphics.DrawEllipse(myPen, x1, y1, width, height);
        }
        
        private void bInitialize_Click(object sender, EventArgs e)
        {
            bInitializeClicked = true;
            
            this.Refresh();
        }

        private void StringInitialize(PaintEventArgs e)
        {
            x1 = 20;
            y1 = 50;

            for (number = 0; number <= 10; number++)
            {
                drawString = number.ToString();
                DrawStrings(drawString, drawFont, myBrushDrawText, x1, y1, e);

                DrawStrings(EnglishNumbers[number].ToString(), drawFont, myBrushDrawText, x1 + 50, y1, e);
                DrawStrings(BulgarianNumbers[number].ToString(), drawFont, myBrushDrawText, x1 + 100, y1, e);
                
                y1 = y1 + 15;
            }
        }

        private void bChangeFormColor_Click(object sender, EventArgs e)
        {
            colorCount++;

            if (colorCount > 2)
                colorCount = 0;

            this.BackColor = Colors[colorCount];
        }

        private void cbColors_SelectedIndexChanged(object sender, EventArgs e)
        {
            number = cbColors.SelectedIndex;

            this.BackColor = EnglishColor[number];
        }

        private bool IsDate(string inputDate)
        {
            DateTime dt;
            return DateTime.TryParse(inputDate,out dt);
        }

        private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
        {
            int mounth = dateTimePicker1.Value.Month;
            int julian = dateTimePicker1.Value.Day;
            int year = dateTimePicker1.Value.Year;

            if (IsDate("2/29/" + year))
                Days[2] = 29;
            else
                Days[2] = 28;

            for (int m = 1; m < mounth - 1; m++)
                julian = julian + Days[m];

            tbDateTime.Text = "Day " + julian;
        }

        private void DisplayColors(PaintEventArgs e)
        {
            x1 = bAddColor.Location.X;
            y1 = bAddColor.Location.Y + bAddColor.Height;
            widht = height = 25;

            foreach (Color getColorFromList in colorList)
            {
                myPen.Color = getColorFromList;
                
                DrawEllipse(x1, y1, widht, height, myPen, e);

                x1 = x1 + 30;
                
                if (x1 > this.Width - 15)
                {
                    x1 = bAddColor.Location.X;
                    y1 = y1 + 30;
                }
            }
        }
        
        private void bAddColor_Click(object sender, EventArgs e)
        {
            bAddColorClicked = true;

            colorDialog1.ShowDialog();

            colorList.Add(colorDialog1.Color);
            
            this.Refresh();
        }
    }
}

Self-assignments

1) Create Windows Forms application that contains two arrays: arrayMounth of type string and arrayDays of type int. When a button is pressed, display the number of days for each month in format > Month: Number of Days.

2) Create an application that allows the insertion of a matrix [3×3] and a calculation of its determinant. Entered matrix elements to be stored in a three-dimensional array. Entering matrix elements to take place via DataGridView control.

В данной теме приведен пример разработки приложения типа Windows Forms Application, которое демонстрирует использование списков (класс List) и ассоциативных массивов (класс Dictionary).

Приложение реализует лабораторную работу одного из учебных заведений.

Используя данный пример Вы получите опыт работы с классами Dictionary<TKey,TValue> и List<T>, которые относятся к обобщенным коллекциям.

При разработке приложения реализованы следующие задачи:

  • чтение данных из файла и отображение их в элементе управления типа ListBox;
  • демонстрация использования класса StreamReader из модуля System.IO для чтения данных из файла;
  • демонстрация работы класса Dictionary<TKey, TValue> для организации коллекции. Класс сохраняет пары «ключ-значение»;
  • демонстрация работы класса List<T> для организации динамического массива или списка.

Содержание

  • Условие задачи
  • Выполнение
    • 1. Запустить MS Visual Studio. Создать проект по шаблону Windows Forms Application
    • 2. Создание формы приложения.
    • 3. Настройка свойств элементов управления.
    • 4. Организация данных в виде структур.
    • 5. Классы Dictionary<Key,Value> и List<T>. Описание основных структур данных.
    • 6. Подключение пространства имен System.IO. Класс StreamReader.
    • 7. Программирование методов чтения данных из файлов «Flight.txt» и «Tickets.txt».
    • 8. Изменение кода конструктора формы Form1().
    • 9. Программирование события клика на кнопке «Вычислить».
    • 10. Запуск приложения на выполнение.

Поиск на других ресурсах:

Условие задачи

Реализовать приложение типа Windows Forms Application с использованием списков и ассоциативных массивов.

Дано два текстовых файла: «Flight.txt» и «Tickets.txt«.

Файлы содержат неограниченное количество строк. Каждая строка файла содержит данные, которые разделены символом ‘ , ‘ (запятая).

Одна строка файла «Flight.txt» имеет следующую структуру:

  • номер рейса (целое число);
  • пункт отправки (строка символов);
  • время вылета, часа (целое число);
  • общее количество мест (целое число).

Одна строка файла «Tickets.txt» имеет следующую структуру:

  • номер билета (целое число);
  • номер рейса (целое число);
  • место (целое число);
  • дата вылета (строка символов);
  • пункт назначения (строка символов);
  • дата прибытия (строка символов);
  • время прибытия (целое число);
  • цена (число с плавающей запятой);
  • время продажи билета (строка символов).

В программе нужно решить следующие задачи:

1. Прочитать данные из файла «Flight.txt» и выполнить над ними следующие операции:

  • отобразить их на Windows-форме в элементе управления типа ListBox;
  • организовать данные в коллекцию (класс Dictionary<TKey, TValue>).

2. Прочитать данные из файла «Tickets.txt» и выполнить над ними следующие операции:

  • отобразить их на Windows-форме в элементе управления типа ListBox;
  • организовать данные в динамический массив (класс List<T>).

3. Вывести на форму рейсы с максимальной продолжительностью полета. Вычисление выполнить с использованием классов Dictionary<TKey, TValue> и List<T>.

4. Вывести на форму число пассажиров, которые ждут отправления в введенный момент времени. Вычисление выполнить с использованием классов Dictionary<TKey, TValue> и List<T>.

Пример содержимого файла Flight.txt:

1,Kiev,18,120
2,Kiev ,19,100
3,Kiev,20,90
4,Kiev,22,150

Пример файла «Tickets.txt«:

1,1,1,05.10.2016,California,06.10.2016,21,500,14:10
2,1,1,05.10.2016,California,06.10.2016,21,500,14:30
3,2,1,05.10.2016,Croatia,06.10.2016,22,245,14:45
4,2,2,05.10.2016,Croatia,06.10.2016,22,245,14:50
5,2,3,05.10.2016,Croatia,06.10.2016,22,245,14:51
6,3,1,05.10.2016,Amsterdam,06.10.2016,23,400,14:55
7,3,3,05.10.2016,Amsterdam,06.10.2016,23,400,15:10
8,3,7,05.10.2016,Amsterdam,06.10.2016,23,400,15:25
9,4,1,05.10.2016,Moscow,06.10.2016,24,350,15:27
10,4,10,05.10.2016,Moscow,06.10.2016,24,350,16:08

 

Выполнение

1. Запустить MS Visual Studio.

Создать проект по шаблону C# как Windows Forms Application. Пример создания такого проекта подробно описывается здесь.

 

2. Создание формы приложения.

Разместить на форме следующие элементы управления (рисунок 1):

  • элемент управления типа ListBox для отображения данных из файла «Flights.txt«. Автоматически создается объект с именем listBox1;
  • элемент управления типа ListBox для отображения данных из файла «Tickets.txt«. Автоматически создается объект с именем listBox2;
  • элементы управления типа Label для отображения информационных сообщений. Создаются объекты с именами label1, label2, label3, label4, label5;
  • элемент управления типа TextBox который представляет строку ввода данных (время отправления). Создается объект с именем textBox1;
  • элемент управления типа Button (кнопка «Вычислить«). Создается объект с именем button1;
  • элемент управления типа ListBox (список рейсов с максимальной продолжительностью полетов). Создается объект с именем listBox3.

Скорректировать размеры и позиции элементов управления так как показано на рисунке 1.

C#. Шаблон Windows Forms. Форма приложения Рис. 1. Форма приложения после размещения элементов управления

 

3. Настройка свойств элементов управления.

Настройка свойств элементов управления осуществляется с помощью окна «Properties» системы Microsoft Visual Studio 2010.

Настроить следующие свойства элементов управления:

  • в элементе управления label1 свойство Text = «Файл Flight.txt»;
  • в элементе управления label2 свойство Text = «Файл Tickets.txt»;
  • в элементе управления label3 свойство Text = «Время отправления»;
  • в элементе управления textBox1 свойство Text = «»;
  • в элементе управления label4 свойство Text = «Число пассажиров, которые ждут отправления: «;
  • в элементе управления button1 свойство Text = «Вычислить»;
  • в элементе управления label5 свойство Text = «Рейсы максимальной продолжительностью полета:».

После настройки свойств и корректирования позиций и размеров элементов управления форма приложения будет иметь вид как показано на рисунке 2.

C#. Шаблон Windows Forms. Форма приложения Рис. 2. Форма приложения после настройки элементов управления

 

4. Организация данных в виде структур.

Данные, которые размещаются в одной строке того или иного файла целесообразно представить в виде структуры. Это осуществляется с целью повышения эффективности работы программы. Так как, в отличие от класса, который есть ссылкой, структуры в C# реализованы как типы-значения. В сравнении со структурами, при доступе к объектам класса по ссылке, увеличивается количество выделенных ресурсов и оперативной памяти.



Представим данные одной строки файла «Flight.txt» в виде структуры Flight:

// Структура "Авиарейсы"
public struct Flight
{
    public int num_r; // номер рейса
    public string punkt_vd; // пункт отправления
    public int time_v; // время вылета
    public int n_places; // общее количество мест
}

По тому же принципу представляются данные одной строки файла «Tickets.txt» в структуре Tickets:

// Структура "Билеты"
public struct Tickets
{
    public int num_t; // номер билета
    public int num_r; // номер рейса
    public int place; // место
    public string date_v; // дата вылета
    public string punkt_pr; //пункт назначения
    public string data_pr; // дата прибытия
    public int time_pr; // время прибытия
    public double price; // цена
    public string time_prod; // время продажи билета
}

Фрагмент листинга файла «Form1.cs» после ввода структур имеет следующий вид:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Kontrolna_UZHNU_1
{
    public partial class Form1 : Form
    {
        // Структура "Авиарейсы"
        public struct Flight
        {
            public int num_r; // номер рейса
            public string punkt_vd; // пункт отправления
            public int time_v; // время вылета
            public int n_places; // общее количество мест
        }

        public struct Tickets
        {
            public int num_t; // номер билета
            public int num_r; // номер рейса
            public int place; // место
            public string date_v; // дата вылета
            public string punkt_pr; //пункт назначения
            public string data_pr; // дата прибытия
            public int time_pr; // время прибытия
            public double price; // цена
            public string time_prod; // время продажи билета
        }

        public Form1()
        {
            InitializeComponent();
        }
    }
} 

 

5. Классы Dictionary<Key,Value> и List<T>. Описание основных структур данных.

В соответствии с условием задачи, данные, которые размещены в файлах «Flight.txt» и «Tickets.txt«, формируются в коллекции.

Коллекция типа «словарь» (Dictionary) представляется в виде: «ключ-значение». Причем значение ключа есть уникальным (не может повторяться).

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

В C# для представления коллекции типа «словарь» (ассоциированный массив) реализовано два базовых класса:

  • класс HashTable – принадлежит к необобщенным коллекциям;
  • класс Dictionary – принадлежит к обобщенным коллекциям.

В соответствии с условием задачи, нужно использовать класс Dictionary.

Для представления ассоциированного массива в текст класса формы нужно ввести объект с именем avia, что есть типа Dictionary<int, Flight>:

// Ассоциированный массив структур "Авиарейсы"
Dictionary<int, Flight> avia = new Dictionary<int, Flight>();

В этом описании тип int есть номером рейса, а тип Flight есть структурой, которая соответствует этому рейсу.

Для разных рейсов номер билета может повторяться. Поэтому, удобно реализовать билеты в виде обобщенного динамического массива типа List<T>. Вместо типа <T> подставляется структура Tickets – в итоге получается List<Tickets>.

Ввести объект с именем tickets:

// Динамический массив (список) структур "Билеты"
List<Tickets> tickets = new List<Tickets>();

 

6. Подключение пространства имен System.IO. Класс StreamReader.

В соответствии с условием задачи, в программе осуществляется чтение из файла. Библиотека классов .NET Framework представляет множество средств для организации взаимодействия программы с файлами (открытие файла, чтение файла и т.д.).

В данной работе использованы возможности класса StreamReader. Этот класс описывается в просторные имен System.IO. Итак, в начале файла «Form1.cs» нужно ввести строку:

using System.IO;

Класс StreamReader предназначен для ввода символов из байтового потока. Для вывода символов в байтовый поток используется класс StreamWriter.

В классе StreamReader есть метод ReadLine(), читающий текстовую строку из файла. Метод ReadLine() возвращает строку типа string. Этот метод будет использован при чтении файла в данной задаче.

 

7. Программирование методов чтения данных из файлов «Flight.txt» и «Tickets.txt«.

Прочитанные из файлов «Flight.txt» и «Tickets.txt» данные отображаются в элементах управления listBox1 и listBox2. Для отображения данных нужно создать два метода.

Первый метод Read_Avia() выполняет следующие операции:

  • читает список авиарейсов из файла «Flight.txt«;
  • формирует ассоциированный массив avia типа Dictionary<int, Flight>;
  • формирует список авиарейсов в listBox1 для его отображения на форме.

Второй метод Read_Tickets() выполняет следующие операции:

  • читает перечень купленных билетов из файла «Tickets.txt«;
  • формирует динамический массив tickets типа List<Tickets>;
  • выводит содержимое файла «Tickets.txt» в listBox2.

Листинг методов Read_Avia() и Read_Tickets() следующий:

public void Read_Avia()
{
  StreamReader sr = new StreamReader("Flight.txt", Encoding.Default);
  string s = "";
  string[] fields;
  Flight sa; // дополнительная переменная - структура типа Flight

  // Основной цикл.
  // В цикле:
  // 1. Читаются данные из файла "Flight.txt"
  // 2. Формируется словарь avia типа Dictionary<int, Flight>

  while (s != null)
  {
    s = sr.ReadLine(); // прочитать строку из файла
    if (s != null)
    {
      fields = s.Split(',');
      // формирование структуры sa типа struct Flight
      sa.num_r = Convert.ToInt32(fields[0]);
      sa.punkt_vd = fields[1];
      sa.time_v = Convert.ToInt32(fields[2]);
      sa.n_places = Convert.ToInt32(fields[3]);

      // добавляем пару <num_r, sa> в словарь avia
      // ключом к структуре есть номер рейса num_r
      avia.Add(sa.num_r, sa);

      // добавить строку s в listBox1
      listBox1.Items.Add(s);
    }
  }
}

public void Read_Tickets()
{
  StreamReader sr = new StreamReader("Tickets.txt", Encoding.Default);
  string s;
  string[] fields; // массив строк-полей структуры Tickets
  Tickets tk; // вспомогательная переменная-структура

  s = sr.ReadLine();

  // Основной цикл.
  // В цикле:
  // 1. Читаются данные из файла "Tickets.txt"
  // 2. Формируется список tickets типа List<Tickets>

  // используем цикл do...while()
  do
  {
    // разбить строку s на части по признаку символа ','
    fields = s.Split(',');

    // заполнить структуру tk
    tk.num_t = Convert.ToInt32(fields[0]);
    tk.num_r = Convert.ToInt32(fields[1]);
    tk.place = Convert.ToInt32(fields[2]);
    tk.date_v = fields[3];
    tk.punkt_pr = fields[4];
    tk.data_pr = fields[5];
    tk.time_pr = Convert.ToInt32(fields[6]);
    tk.price = Convert.ToDouble(fields[7]);
    tk.time_prod = fields[8];

    // добавить заполненную структуру в список tickets
    tickets.Add(tk);

    listBox2.Items.Add(s);
    s = sr.ReadLine();
  }
  while (s != null);
}

Объясним некоторые фрагменты кода в методах Read_Avia() и Read_Tickets().

Чтение файла осуществляется с помощью класса StreamReader, который предназначен для ввода символов из байтового потока. Открытие файлов реализуется в конструкторе класса StreamReader:

StreamReader sr = new StreamReader("Flight.txt", Encoding.Default);
StreamReader sr = new StreamReader("Tickets.txt", Encoding.Default);

Чтение строки из файла осуществляется методом ReadLine() класса StreamReader. Если достигнут конец файла, то метод возвращает null.

С помощью строки

fields = s.Split(',');

происходит разделение строки на составные части. Разделитель между составными частями – это символ ‘ , ‘.

Строка

avia.Add(sa.num_r, sa);

добавляет в коллекцию avia типа Dictionary<int, Flight> номер рейса и заполненную структуру sa.

Строка

tickets.Add(tk);

добавляет в коллекцию tk типа List<Tickets> структуру tk.

 

8. Изменение кода конструктора формы Form1().

Методы Read_Avia() и Read_Tickets() размещаются в конструкторе формы Form1().

Листинг конструктора формы Form1() следующий:

public Form1()
{
    InitializeComponent();
    Read_Avia();
    Read_Tickets();
}

 

9. Программирование события клика на кнопке «Вычислить«.

Листинг обработчика события клика на кнопке «Вычислить» имеет вид:

private void button1_Click(object sender, EventArgs e)
{
  // Расчет
  // 1. Рейсы с максимальной продолжительностью полета
  int i, j;
  int max, tmp;
  bool f_first = true;

  max = 0;

  foreach (var a in avia)
  {
    foreach (var t in tickets)
      if (a.Value.num_r == t.num_r)
      {
        if (f_first)
        {
          max = t.time_pr - a.Value.time_v;
          f_first = false;
        }
        else
        {
          tmp = t.time_pr - a.Value.time_v;
          if (max < tmp) max = tmp;
        }
      }
  } // на выходе получаем максимальную длительность полета в переменной max

  // формирование списка рейсов с максимальной продолжительностью полета
  listBox3.Items.Clear();

  foreach (var a in avia)
  {
    foreach (var t in tickets)
      if (a.Value.num_r == t.num_r)
      {
        tmp = t.time_pr - a.Value.time_v;
        if (tmp == max)
        {
          string s;
          s = a.Value.num_r.ToString() + ", " +
              a.Value.punkt_vd + ", " +
              a.Value.time_v.ToString() + ", " +
              a.Value.n_places.ToString() + " - " +
              t.num_t.ToString() + ", " +
              t.punkt_pr + ", " +
              t.time_pr.ToString() + ", " +
              t.place.ToString();

              listBox3.Items.Add(s);
        }
      }
  }

  label4.Text = "Рейсы с максимальной продолжительностью полета: " + max.ToString();

  // 2. Число пассажиров, которые ждут отправления в введенный момент времени
  int tm, k;

  tm = Int32.Parse(textBox1.Text); // получить время
  k = 0; // число пассажиров
  foreach (var a in avia)
  {
    foreach (var t in tickets)
      if ((a.Value.num_r == t.num_r)&&(tm==a.Value.time_v))
        k++;
  }

  label5.Text = "Число пассажиров, которые ждут отправления: " + k.ToString();
}

В вышеприведенном листинге следует отметить. При просмотре коллекций используется оператор foreach (и только foreach). Оператор foreach служит для циклического обращения к элементам коллекции, которая представляет собой группу объектов. Использование других операторов цикла приводит к ошибке.

Список рейсов с максимальной продолжительностью полета выводится в элемент управления listBox3.

 

10. Запуск приложения на выполнение.

Результат работы приложения изображен на рисунке 3.

C#. Шаблон Windows Forms. Выполнение приложения работы со списками Рис. 3. Результат работы приложения

 


2 Answers

This is certainly possible to do. Sharing the event handler is fairly easy to do in this case because the Button which raised the event is sent as part of the event args. It will be the sender value and can be cast back to a Button

Here is some sample code

class Form1 : Form {
  private Button[] _buttons;
  public Form1(int count) { 
    _buttons = new Button[count];
    for ( int i = 0; i < count; i++ ) {
      var b = new Button();
      b.Text = "Button" + i.ToString()
      b.Click += new EventHandler(OnButtonClick);
      _buttons[i] = b;
    }
  }
  private void OnButtonClick(object sender, EventArgs e) {
    var whichButton = (Button)sender;
    ...
  }
}

answered Jan 30, 2010 at 16:59

JaredPar's user avatar

JaredParJaredPar

735k149 gold badges1244 silver badges1455 bronze badges

1

  • this solution works for me. it’s exactly what i was looking for.

    Jan 30, 2010 at 18:10

Based on Kevins comment:

foreach(Button b in MyForm.Controls.OfType<Button>())
{
    b.Click += Button_Click;
}

void Button_Click(object sender, EventArgs e)
{
    Button clickedButton = sender as Button;
}

answered Jan 30, 2010 at 15:47

Jan Jongboom's user avatar

Jan JongboomJan Jongboom

26.6k9 gold badges83 silver badges120 bronze badges

  • Мастер расширения тома windows 10
  • Мастер диагностики и устранения неполадок скачать для windows 7
  • Максимальное количество пользователей windows xp
  • Максимальный размер имени файла windows
  • Масштаб и разметка windows 10