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

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

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

private void Form1_Load(object sender, System.EventArgs e) {

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

 DataGrid grid = new DataGrid();

 AddType(grid.GetType());

}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. НаТав Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ System.Windows.Forms.DataGrid, ΡƒΠ²ΠΈΠ΄ΠΈΠΌ:

Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° сборки

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

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ сборку Π½Π°ΠΌ понадобится URL. Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π² Form1_Load:

private void Form1_Load(object sender, System.EventArgs e) {

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

 DataGrid grid = new DataGrid();

 AddType(grid.GetType());

 // Π½Π°ΠΉΡ‚ΠΈ имя нашСй сборки

 String filename = this.GetType().Module.Assembly.CodeBase;

Π­Ρ‚Π° строка являСтся ΠΎΠ±Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΎΠΉ для получСния сборки, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π΅ΠΉ класс ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ вызываСтся ΠΊΠΎΠ΄. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Π΅Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΠΈΠ· URL сборки, содСрТащСй Form1.

Нам Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ сборки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ try…catch, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ процСссы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΉΡ‚ΠΈ Π² этой ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠ±Ρ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π° Assembly:

 // ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ сборку ...

 try {

  // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ LoadFrom ...

  Assembly controlAssembly = Assembly.LoadFrom(filename);

ПослС получСния сборки ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Π² Π½Π΅ΠΉ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…:

  // Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ список Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… ...

  foreach(Type testType in controlAssembly.GetTypes()) {

Π”Π°Π»Π΅Π΅ Ρ…ΠΈΡ‚Ρ€ΠΎΡΡ‚ΡŒ состоит Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляр провСряСмого Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…, Π½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² Control. Π’Π°ΠΊ ΠΊΠ°ΠΊ всС это ΠΏΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½ΠΎ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π±Π»ΠΎΠΊ try…catch, Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ имССтся ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ элСмСнт управлСния.

   // ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляр элСмСнта управлСния

   // ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² элСмСнт управлСния ...

   try {

    Control testControl = (Control)Activator.CreateInstance(testType);

ΠŸΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ совСт. System.Windows.Forms.Form являСтся ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌ ΠΎΡ‚ Control, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ свойств Control для Π²Ρ‹Π²ΠΎΠ΄Π° элСмСнтов управлСния, нарисованных Π² Ρ„ΠΎΡ€ΠΌΠ΅. Если ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ свойство TopLevelControl, ΠΎΠ½ΠΎ всСгда Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π΄Π°Π½ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ класса ΠΈΠ· Ρ„ΠΎΡ€ΠΌΡ‹.

    // Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ,

    // Ρ‡Ρ‚ΠΎ это Π½Π΅ элСмСнт управлСния "Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня" ...

    if (testControl.TopLevelControl == null) {

     // Ссли ΠΌΡ‹ здСсь оказались, Ρ‚ΠΎ это элСмСнт управлСния ...

     AddType(testType);

    }

   }

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ двумя ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ:

   catch {

    // Ссли ΠΌΡ‹ здСсь, ΠΌΡ‹ Π½Π΅ заботимся ΠΎΠ± ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅!

   }

  }

 } catch(Exception Π΅Π΅) {

  MessageBox.show("The assembly could not be loaded. " + Π΅Π΅.Message);

 }

}

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ это ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ элСмСнты управлСния. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ класс, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ DemoTextBox, ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ наслСдования:

public class DemoTextBox : System.Windows.Forms.TextBox

Π’Π΅ΠΏΠ΅Ρ€ΡŒ создадим Π΄Ρ€ΡƒΠ³ΠΎΠΉ класс, Π½Π° этот Ρ€Π°Π· с ΠΈΠΌΠ΅Π½Π΅ΠΌ DemoMonthCalendar, ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅:

public class DemoMonthCalendar : System.Windows.Forms.MonthCalendar

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Π”ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Из этой ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΌΡ‹ ΡƒΠ·Π½Π°Π»ΠΈ, ΠΊΠ°ΠΊ динамичСски ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ элСмСнты управлСния ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΈΡ… Π² Ρ„ΠΎΡ€ΠΌΡƒ. ΠœΡ‹ Π²Π²Π΅Π»ΠΈ Π½ΠΎΠ²Ρ‹ΠΉ класс, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ System.Window.Forms.Button, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ свойства ΠΊΠ½ΠΎΠΏΠΊΠ΅. ΠœΡ‹ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ с Π½ΠΎΠ²Ρ‹ΠΌΠΈ элСмСнтами управлСния ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ событий. НаконСц, ΠΌΡ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ просмотра сборки Π² поисках классов ΠΈ использовали ΠΈΠ·ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ для создания простой ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹, которая загруТаСтся ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ эти классы ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.