Событие нажатия Dynamic-usercontrol

UserControl:

private string lastName;
public string LastName
{
get { return lastName; }
set
{
    lastName = value;
    lastNameTextBox.Text = value;
}
}

Форма:

using (SqlConnection myDatabaseConnection = new SqlConnection(myConnectionString.ConnectionString))
        {
            myDatabaseConnection.Open();
            using (SqlCommand SqlCommand = new SqlCommand("Select LasatName from Employee", myDatabaseConnection))
            {
                int i = 0;
                SqlDataReader DR1 = SqlCommand.ExecuteReader();
                while (DR1.Read())
                {
                    i++;
                    UserControl2 usercontrol = new UserControl2();
                    usercontrol.Tag = i;
                    usercontrol.LastName = (string)DR1["LastName"];
                    usercontrol.Click += new EventHandler(usercontrol_Click); 
                    flowLayoutPanel1.Controls.Add(usercontrol);
                }
            }
        }

Форма загружает записи из базы данных и отображает каждое LastName в каждом текстовом поле usercontrols, которое создается динамически. Как отобразить дополнительную информацию, такую ​​как адрес, в текстовом поле формы при нажатии кнопки динамического управления пользователем?

Попытка:

    private void usercontrol_Click(object sender, EventArgs e)
    {
        using (SqlConnection myDatabaseConnection = new SqlConnection(myConnectionString.ConnectionString))
        {
            myDatabaseConnection.Open();
            using (SqlCommand mySqlCommand = new SqlCommand("Select Address from Employee where LastName = @LastName ", myDatabaseConnection))

            {
                UserControl2 usercontrol = new UserControl2();
                mySqlCommand.Parameters.AddWithValue("@LastName", usercontrol.LastName;
                SqlDataReader sqlreader = mySqlCommand.ExecuteReader();

                if (sqlreader.Read())
                {
                    textBox1.Text = (string)sqlreader["Address"];
                }

            }
        }
    }

2 ответа

Решение

Первый. В своем первом фрагменте кода вы выполняете "Select ID from ...", но ожидаете найти поле "LastName" в считывателе - не будет работать.

Во-вторых. Если вы знаете, что вам потребуется дополнительная информация от Employee Таблица, я предлагаю вам хранить его в том же UserControl где вы положили LastName, Выполните "Выбрать * из...", добавьте другое поле и свойство UserControl2 и назначить его в Read цикл:

usercontrol.Address = (string)DR1["Address"];

В третьих. Во втором фрагменте кода используйте

UserControl2 usercontrol = (UserControl2)sender;

вместо

UserControl2 usercontrol = new UserControl2();

потому что недавно созданный пользовательский элемент управления не будет иметь никаких LastName назначены.

Затем:

private void usercontrol_Click(object sender, EventArgs e)
{
    UserControl2 usercontrol = (UserControl2)sender;
    textBox1.Text = usercontrol.Address;
}

Внутри вашего пользовательского элемента управления UserControl2 (в конструкторе или методе InitializeComponent) вы должны переслать событие click потенциальным слушателям.

Что-то вроде того:

public UserControl2()
{
    ...
    this.lastNameTextBox.Click += (s, a) => OnClick(a);
    ...
}
Другие вопросы по тегам