Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C# для профСссионалов. Π’ΠΎΠΌ IIΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 166

Автор Π‘ΠΈΠΌΠΎΠ½ Робинсон

ВаТная Π΄Π΅Ρ‚Π°Π»ΡŒ β€” Π² .NET события ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½ΠΎΠ²ΠΎΠ³ΠΎ экзСмпляра System.EventHandler, Ρ‚ΠΎ ΠΎΠ±Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ пороТдСния события. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ фактичСски получится ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π° это Π½Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ случайно ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ.

ΠœΡ‹ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ, ΠΊΠ°ΠΊ выглядит наша функция AddToLog,β€” сдСлаСм это сСйчас:

// AddToLog β€” обновляСт прСдставлСниС ΠΆΡƒΡ€Π½Π°Π»Π° ...

private void AddToLog(String buf) {

 // обновляСт элСмСнт управлСния ΠΆΡƒΡ€Π½Π°Π»Π° ...

 txtLog.Text = (buf + "\r\n" + txtLog.Text);

}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ½Π°ΠΆΠΈΠΌΠ°Ρ‚ΡŒ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠΈ:

Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ события Π² DynamicButton, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ… создаСтся ΠΌΠ΅Ρ‚ΠΎΠ΄:

// DynamicButton_Enter ...

protected void DynamicButton_Enter(object sender, System.EventArgs e) {

 // ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ sender Π² button ...

 DynamicButton button = (DynamicButton)sender;

 // msgbox ...

 AddToLog("Enter " + button.DynamicId);

}


// DynamicButton_Leave ...

protected void DynamicButton_Leave(object sender, System.EventArgs e) {

 // ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ sender Π² button ...

 DynamicButton button = (DynamicButton)sender;

 // msgbox ...

 AddToLog("Left " + button.DynamicId);

}

Π—Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ…:

// ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ

newButton.Click +=

 new System.EventHandler(this.DynamicButton_Click);

newButton.MouseEnter +=

 new System.EventHandler(this.DynamicButton_Enter);

newButton.MouseLeave +=

 new System.EventHandler(this.DynamicButton_Leave);

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли снова Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π² ΠΆΡƒΡ€Π½Π°Π» Π±ΡƒΠ΄ΡƒΡ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒΡΡ сообщСния ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ пСрСмСщСния ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌ.

Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Π Π°Π·ΠΎΠ±Ρ€Π°Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€ создания динамичСских элСмСнтов управлСния, Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ эта Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² прилоТСниях.

ДинамичСскиС элСмСнты управлСния ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для настройки интСрфСйса ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ прилоТСния Π² зависимости ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… срСды выполнСния. ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ этого являСтся Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… возмоТностСй Π² панСль инструмСнтов, ΠΊΠΎΠ³Π΄Π° Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ прилоТСния вносятся Π½ΠΎΠ²Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ срСдства (plug-ins) ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ. НапримСр, установка Adobe Acrobat Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ автоматичСски Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² панСль инструмСнтов Word ΠΊΠ½ΠΎΠΏΠΊΡƒ для создания Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Acrobat.

Π”Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° администрирования Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. Когда ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° соСдиняСтся с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…, Π² интСрфСйс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠ°, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΈΠΌΠ΅ΡŽΡ‰ΡƒΡŽΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ. Или ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ мноТСство элСмСнтов управлСния тСкстовых ΠΏΠΎΠ»Π΅ΠΉ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ всСх Ρ„Π°ΠΉΠ»ΠΎΠ² XML, содСрТащихся Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, ΠΈ Ρ‚.Π΄.

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ собираСмся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‰Π΅Π΅ с диска сборку, ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‰Π΅Π΅ сборку Π² поисках Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΎΡ‚ System.Windows.Forms.Control, ΠΈ выводящСС ΠΊΠ½ΠΎΠΏΠΊΡƒ Π² Ρ„ΠΎΡ€ΠΌΠ΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. НаТатиС Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ экзСмпляр элСмСнта управлСния ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² Ρ„ΠΎΡ€ΠΌΡƒ.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Visual C# β€” Windows Application ΠΈ Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ ControlLoader. Π’ самом Π½Π°Ρ‡Π°Π»Π΅ ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π² Π½ΠΎΠ²ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… элСмСнтов управлСния, Π½ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ свойство Text Π½Π° Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Ρ‚ΠΈΠΏΠ° "Control Container".

Π˜Ρ‚Π°ΠΊ, Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‡Π»Π΅Π½Ρ‹ Π² Ρ„ΠΎΡ€ΠΌΡƒ:

public class Form1 : System.Windows.Forms.Form {

 // Ρ‡Π»Π΅Π½Ρ‹ ...

 private ArrayList _buttons = new ArrayList();

 private int _nextY = ButtonSpacing;

 private Control _containedControl;

 // константы ...

 const int ButtonHeight = 25;

 const int ButtonSpacint = 5;

 const int ButtonWidth = 200;

ΠœΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ список ΠΊΠ½ΠΎΠΏΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² ArrayList с ΠΈΠΌΠ΅Π½Π΅ΠΌ _buttons. ΠŸΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΊ Ρ„ΠΎΡ€ΠΌΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΅Π΅ Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ Ρƒ-ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π΅, Ρ‚.Π΅. _nextY. Рассмотрим Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ элСмСнт управлСния Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ Π² _containedControl. НаконСц, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΡƒ, которая описываСт ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΡƒ ΠΊΠ½ΠΎΠΏΠΎΠΊ, ΠΈ ΠΎΠ½Π° задаСтся трСмя константами Π²Π½ΠΈΠ·Ρƒ.

Π‘Π°ΠΌΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΈΠ· Π½ΠΎΠ²ΠΎΠ³ΠΎ класса, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΡ‚ System.Windows.Forms.Button. Π­Ρ‚ΠΎΡ‚ Π½ΠΎΠ²Ρ‹ΠΉ класс называСтся TypeButton ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ свойство ControlType, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ содСрТит ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ System.Type. Π­Ρ‚ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Type прСдставляСт элСмСнт управлСния Π² Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΠΎΠΉ сборкС. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²Ρ‹ΠΉ класс с ΠΈΠΌΠ΅Π½Π΅ΠΌ TypeButton ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ссылку Π½Π° пространство ΠΈΠΌΠ΅Π½ System.Windows.Forms.

using System;

using System.Windows.Forms;

Π—Π°Ρ‚Π΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΠΎΠ΄:

public class TypeButton System.Windows.Forms.Button {

 public Type _controlType;


 public TypeButton() {

 }


 // ControlType β€” ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ Π·Π°Π΄Π°Ρ‚ΡŒ свойство ...

 public Type ControlType {

  get {

   return _controlType;

  }

  set {

   _controlType = value;

   this.Text = _controlType.FullName;

  }

 }

}

Как ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, задавая свойство ControlType, ΠΌΡ‹ измСняСм тСкст ΠΊΠ½ΠΎΠΏΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ стал ΠΏΠΎΠ»Π½Ρ‹ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠ°.

ΠœΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ΅Π½ для создания TypeButton, создаСт экзСмпляр элСмСнта управлСния. Π”ΠΎΠ±Π°Π²ΠΈΠΌ этот ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ System.Activator для создания экзСмпляра класса ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰ΠΈΠΉ Π΅Π³ΠΎ Π² System.Windows.Forms.Control:

// CreateInstance β€” созданиС экзСмпляра Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… ... 

public Control CreateInstance() {

 // Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ экзСмпляр Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта управлСния ...

 return (Control)Activator.CreateInstance(ControlType);

}

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΎΠΊ

Для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΡ‡Π½ΠΎΠ³ΠΎ запуска Π΄ΠΎΠ±Π°Π²ΠΈΠΌ TypeButton, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт экзСмпляр элСмСнта управлСния System.Windows.Forms.DataGrid. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ дСлаСтся, Π½Π΅ вдаваясь Π² Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ трудности, связанныС с Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ сборки ΠΈ просмотром Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….

ΠœΠ΅Ρ‚ΠΎΠ΄ Form1.AddType Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ System.Type ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ TypeButton Π² Ρ„ΠΎΡ€ΠΌΡƒ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляр TypeButton ΠΈ Π·Π°Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ свойство ControlType Π½ΠΎΠ²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ:

// AddType - Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ Ρ‚ΠΈΠΏΠ° Π² ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΡƒ ...

public void AddType(Type ControlType) {

 // ΠΏΠ΅Ρ€Π²ΠΎΠ΅: ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ Ρ‚ΠΈΠΏΠ° ...

 TypeButton button = new TypeButton();

 button.ControlType = ControlType;

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ TypeButton Π² ArrayList, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит список ΠΊΠ½ΠΎΠΏΠΎΠΊ:

 // Π²Ρ‚ΠΎΡ€ΠΎΠ΅: Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ эту ΠΊΠ½ΠΎΠΏΠΊΡƒ Π² массив

 _buttons.Add(button);

ПослС этого ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² Ρ„ΠΎΡ€ΠΌΡƒ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Π΅ Π² список элСмСнтов управлСния Ρ„ΠΎΡ€ΠΌΡ‹:

 // Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ размСстим ΠΊΠ½ΠΎΠΏΠΊΡƒ

 button.Left = ButtonSpacing;

 button.Width = ButtonWidth;

 button.Top = _nextY;

 button.Height = ButtonHeight;

 // Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρƒ ...

 _nextY += (ButtonHeight + ButtonSpacing);

 // вывСсти ΠΊΠ½ΠΎΠΏΠΊΡƒ ...

 this.Controls.Add(button);

НаконСц, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ событиС click (Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅) ΠΊΠ½ΠΎΠΏΠΊΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ экзСмпляр элСмСнта управлСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ прСдставляСт:

 // Π·Π°Ρ‚Π΅ΠΌ присоСдиняСм ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события ...

 button.Click += new EventHandler(this.ButtonClick);

}

Пока Π΅Ρ‰Π΅ ΠΌΡ‹ Π½Π΅ создали ButtonClick, β€” сдСлаСм это сСйчас:

// ButtonClick β€” вызываСтся всякий Ρ€Π°Π· ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ ...

protected void ButtonClick(object sender, System.EventArgs e) {

 // ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ sender Π² ΠΊΠ½ΠΎΠΏΠΊΡƒ Ρ‚ΠΈΠΏΠ° ...

 TypeButton button = (TypeButton)sender;

НашСй ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ являСтся ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ sender Π² TypeButton. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ CreateInstance для создания элСмСнта управлСния. Если ΠΌΡ‹ ΡƒΠΆΠ΅ ΠΈΠΌΠ΅Π΅ΠΌ элСмСнт управлСния, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ сначала ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΈΠ· списка элСмСнтов управлСния Ρ„ΠΎΡ€ΠΌΡ‹:

// Ссли ΡƒΠΆΠ΅ имССтся содСрТащийся элСмСнт управлСния, ΡƒΠ΄Π°Π»ΠΈΠΌ Π΅Π³ΠΎ ...

 if (_containedControl != null)

  Controls.Remove(_containedControl);

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ элСмСнт управлСния:

 // ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляр Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта управлСния...

 _containedControl = button.CreateInstance();

НаконСц, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ элСмСнт управлСния Π² Ρ„ΠΎΡ€ΠΌΡƒ.

 // ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ элСмСнт управлСния Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅ ...

 _containedControl.Left = ButtonWidth + (3 * ButtonSpacing);

 _containedControl.Top = ButtonSpacing;

 _containedControl.Width = this.Width - _containedControl.Left - (4 * ButtonSpacing);

 _containedControl.Height = this.Height - (8 * ButtonSpacing);

 this.Controls.Add(_containedControl);

}

ВСстированиС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ сдСланного, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ Π² Ρ„ΠΎΡ€ΠΌΡƒ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ элСмСнт управлСния System Windows.Forms.DataGrid. Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π² Form1: