MVP, заполнять данными textbox, источник данных в качестве datasource
Паттерн mvp, запросом в базу данных пытаюсь заполнять textbox. Запрос не возвращает данные в текстбокс, подозреваю, что в самой форме нужно указать источник данных для Textbox-a. Для текстбоксов Datasource не существует, что нужно указать источником данных. Ниже выложил код и изображение отладчика, помогите разобраться.
Тут работает:
private void button1_Click(object sender, EventArgs e)
{
var Connect = ConfigurationManager.ConnectionStrings["MysqlConnection"].ConnectionString;
using (var conn = new MySqlConnection(Connect))
using (var command = new MySqlCommand())
{
conn.Open();
command.Connection = conn;
string costumer = txt_CustId.Text;
command.CommandText = @"Select customer.id, customer.name, customer.contact, customer.address From customer WHERE customer.id = '" + costumer + "'";
MySqlDataReader dr = command.ExecuteReader();
if (dr.Read())
{
txt_CustId.Text = dr.GetValue(0).ToString();
txt_Name.Text = dr.GetValue(1).ToString();
txt_Otdel.Text = dr.GetValue(2).ToString();
txt_Address.Text = dr.GetValue(3).ToString();
}
}
}
Тут не работает:
public void SearchCustomer(CustomerModel customer)
{
var customersList = new List<CustomerModel>();
using (var connection = new MySqlConnection(connectionString))
using (var command = new MySqlCommand())
{
connection.Open();
command.Connection = connection;
CustomerView view = new CustomerView();
command.CommandText = "SELECT customer.id, customer.name, customer.contact, customer.address FROM customer WHERE customer.id = '" + customer.ID + "'";
MySqlDataReader reader = command.ExecuteReader();
{
if (reader.Read())
{
var customerModel = new CustomerModel
{
ID = (int)reader.GetValue(0),
CustomerNamee = reader.GetValue(1).ToString(),
Contactt = reader.GetValue(2).ToString(),
Addresss = reader.GetValue(3).ToString()
};
customersList.Add(customerModel);
}
}
}
}
Ответы (1 шт):
На что ответить? Ваш вопрос по-прежнему слишком запутанный и непонятный. Зачем вы упоминаете MVP? Зачем вы упоминаете TextBox и DataSource? / Для какой цели приложен скриншот? Что мы из него должны узнать?
Попробую разобраться.
Смотрим сигнатуру метода:
void SearchCustomer(CustomerModel customer)
Он ничего не возвращает - void.
Внутри этого метода создаётся локальная переменная-список var customersList = new List<CustomerModel>();. Затем в этот список добавляются данные: customersList.Add(customerModel);. И всё! Эти данные так и остаются внутри метода.
Во-первых, вы читаете из БД всего одну строку. Об этом говорит условие if (reader.Read()). Если бы читали много строк, то использовали бы while (reader.Read()).
Поэтому убираем список и возвращаем из метода один экземпляр CustomerModel.
Также у вас зачем-то создаётся и не используется какой-то вью: CustomerView view = new CustomerView();. Для чего эта строка?
Что это за нейминг: CustomerNamee, Contactt, Addresss? Пользуйтесь словарём. Пишите грамотно, не добавляйте лишние символы.
Теперь рассмотрим ваш sql-запрос.
customer.id = '" + customer.ID + "'";
После конкатенации получится следующее (допустим, что ID = 5):
customer.id = '5'
'5' - это строковый литерал. А из дальнейшего кода: ID = (int)reader.GetValue(0), - становится ясно, что там целое число. Не нужно брать это значение в одинарные кавычки!
Но ещё лучше будет использовать параметризованный запрос.
С учётом всего вышесказанного код должен выглядеть примерно так:
public CustomerModel SearchCustomer(int id)
{
string sql = "SELECT customer.id, customer.name, customer.contact, customer.address FROM customer WHERE customer.id = @id";
using (var connection = new MySqlConnection(connectionString))
using (var command = new MySqlCommand())
{
connection.Open();
command.Connection = connection;
command.CommandText = sql;
command.Parameters.Add("id", MySqlDbType.Int32).Value = id;
using (var reader = command.ExecuteReader())
{
if (reader.Read())
{
return new CustomerModel
{
ID = reader.GetInt32(0),
Name = reader.GetString(1),
Contact = reader.GetString(2),
Address = reader.GetString(3)
};
}
else
return null; // или бросайте исключение
}
}
}
Теперь этот метод можно вызывать в другом месте как-то так:
private void button1_Click(object sender, EventArgs e)
{
int id = int.Parse(txt_CustId.Text);
var customer = SearchCustomer(id);
txt_CustId.Text = customer.ID.ToString();
txt_Name.Text = customer.Name;
txt_Otdel.Text = customer.Contact;
txt_Address.Text = customer.Address;
}
Продёмся по именованиям в этом методе.
Что такое button1? Что делает эта кнопка? Можно это определить по её названию? Нет.
Давайте всем сущностям говорящие названия. Если по нажатию на кнопку происходит поиск, то и назовите её searchButton.
ТекстБоксы вы назвали более-менее нормально. Однако, в C# не принято использовать знак подчёркивания в именах. Согласно правилам, имена должны выглядить как-то так: nameTextBox, addressTextBox и т. д.
Для ввода чисел от пользователя используйте NumericUpDown вместо тектсбокса. Его можно настроить на целые числа.
