BillWoodruff
Глядя на ваш код, я вижу, что вы не храните ссылку на элементы управления Textbox, которые вы создаете во время выполнения. В тот момент, код обработчика button1_click выходов нет переменной 'ТБ.
Итак, если вы хотите прочитать текст в одном из этих созданных текстовых полей, вам придется найти его, но вы даже не дали текстовым полям четкого идентифицирующего значения имени: как вы его найдете, если в форме есть много других элементов управления ?
Это почти всегда ошибка, потому что вы будете хотеть ... в любом реальном приложении ... в какой-то момент используйте созданные во время выполнения элементы управления ... в случае текстовых полей: прочитайте их текстовое содержимое, установите их текстовое содержимое. И, вероятно, вы захотите прикрепить некоторые события к этим созданным во время выполнения элементам управления.
Существует множество способов отслеживать текстовые поля; вот одна идея:
a. создайте новый проект WinForm: 'TestRunTimeControlCreation
б. поместите две кнопки на форму 1: "button1", "button2".
c. добавьте в проект вторую форму: 'Form2
d. замените автоматически сгенерированный код для формы 1 следующим:
#region Region:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
#endregion
namespace TestRunTimeControlCreation
public partial class Form1 : Form
{
private const string TextBoxNamePrefix = "tbx_";
private readonly Dictionary<string, TextBox> _dctForm1NameToTBox = new Dictionary<string, TextBox>();
private readonly Dictionary<string, TextBox> _dctForm2NameToTBox = new Dictionary<string, TextBox>();
private readonly Form2 _form2Instance;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
_form2Instance = new Form2();
_form2Instance.Show();
}
private void button1_Click(object sender, EventArgs e)
{
AddTextBoxToForm(this, 5);
}
private void button2_Click(object sender, EventArgs e)
{
AddTextBoxToForm(_form2Instance, 5);
}
public void AddTextBoxToForm(Form targetform, int nTextBox)
{
if (targetform == null || nTextBox < 1)
{
throw new ArgumentException("error in AddTextBoxToForm");
}
string namebase = string.Format("{0}{1}", targetform.Name, TextBoxNamePrefix);
int tBxCnt;
for (var x = 0; x < nTextBox; x++)
{
var newTextBox = new TextBox();
newTextBox.Size = new Size(100,25);
targetform.Controls.Add(newTextBox);
if (targetform is Form1)
{
tBxCnt = _dctForm1NameToTBox.Count;
newTextBox.Name = string.Format("{0}{1}", namebase, tBxCnt);
_dctForm1NameToTBox.Add(newTextBox.Name, newTextBox);
// set location on Form1 here
newTextBox.Location = new Point(30, tBxCnt*40 + 60);
}
else if (targetform is Form2)
{
tBxCnt = _dctForm2NameToTBox.Count;
newTextBox.Name = string.Format("{0}{1}", namebase, tBxCnt);
_dctForm2NameToTBox.Add(newTextBox.Name, newTextBox);
// set location on Form2 here
newTextBox.Location = new Point(30, tBxCnt*40 + 30);
}
else
{
// something is wrong !
throw new ArgumentException(string.Format("invalid Form parameter{0}", targetform.Name));
}
newTextBox.Enter += OnTextBoxEnter;
newTextBox.Leave += OnTextBoxLeave;
// apply your own labeling scheme here ?
newTextBox.Text = newTextBox.Name;
}
}
private void OnTextBoxLeave(object sender, EventArgs eventArgs)
{
TextBox tBox = sender as TextBox;
Console.WriteLine("Leave TextBox: {0} TextBox: {1} text: {2}", tBox.TopLevelControl.Name, tBox.Name, tBox.Text);
}
private void OnTextBoxEnter(object sender, EventArgs eventArgs)
{
TextBox tBox = sender as TextBox;
Console.WriteLine("Enter TextBox: {0} TextBox: {1} text: {2}", tBox.TopLevelControl.Name, tBox.Name, tBox.Text);
}
}
}
Подключите обработчики событий для двух кнопок на форме 1 к обработчикам кликов "button1" и "button2".
Запуск проекта. Нажмите кнопки, нажмите в течение нескольких текстовых полей на форме form1 щелкните в несколько текстовых полей на форме Form2. Затем: проверьте, что было записано в консоль (в окне вывода Visual Studio).
После того как вы создали такую структуру словаря для сопоставления свойств "имя", назначенных созданным текстовым полям во время выполнения, вы можете получить доступ к любому текстовому полю с помощью строкового ключа " имя:
TextBox getATbx;
if(_dctForm1NameToTBox.TryGetValue("Form1_Tbx_2", out getATbx))
{
// getATbx got a Textbox
}