Событие нажатия 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);
...
}