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 шт):

Автор решения: Alexander Petrov

На что ответить? Ваш вопрос по-прежнему слишком запутанный и непонятный. Зачем вы упоминаете 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 вместо тектсбокса. Его можно настроить на целые числа.

→ Ссылка