Событие keydown не может добавить элемент в datagridview

Когда я использую сканер для сканирования штрих-кода,
элемент будет добавлен в первую строку, и когда я отсканирую второй штрих-код,
элемент не будет добавлен в datagridview, а просто добавит только строку.
Мой столбец в datagridview: productid, ProductName, Description, Stock, UOM, Price.

 private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {

            if (e.KeyCode == Keys.Enter)
            {
                DataGridViewRow newRow = new DataGridViewRow();
                if (textBox1.Text.Length != 0)
                {
                    conn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=F:\Database\book1.mdf;Integrated Security=True;Connect Timeout=30");
                    conn.Open();
                    SqlDataAdapter adp = new SqlDataAdapter("SELECT productid,ProductName,Description,Stock,UOM,Price from ProductTable where productId='" + textBox1.Text + "'", conn);
                    DataTable dt = new DataTable();
                    adp.Fill(dt);

                    foreach (DataRow item in dt.Rows)
                    {
                        int i = dataGridView1.RowCount -1;
                        dataGridView1.Rows.Insert(i);
                        dataGridView1.Rows.Add();
                        dataGridView1.Rows[i].Cells[0].Value = item[0].ToString();
                        dataGridView1.Rows[i].Cells[1].Value = item[1].ToString();
                        dataGridView1.Rows[i].Cells[2].Value = item[2].ToString();
                        dataGridView1.Rows[i].Cells[3].Value = item[3].ToString();
                        dataGridView1.Rows[i].Cells[4].Value = item[4].ToString();
                        dataGridView1.Rows[i].Cells[5].Value = item[5].ToString();
                    }
                }
            }
        }

Скриншоты страницы:

Не добавляется в DGV, но добавляется строка? Я не уверен, что понимаю эту часть. Разве ты не хочешь новый ряд?

Cid 28.01.2019 13:07

потому что в моем представлении данных добавлена ​​кнопка удаления, ячейка общей суммы, поэтому, когда я сканирую второй штрих-код, это будет кнопка удаления... только строка, без данных, которые я сканирую

LauTan 28.01.2019 13:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
75
2

Ответы 2

Ваш подход, если ваш productid является уникальным ключом, как и должно быть, всегда будет возвращать только один результат, я действительно не вижу здесь необходимости в операторе foreach. Более того, каждый раз, когда вы открываете соединение с базой данных, вы должны закрывать его.

Мой подход с учетом этого был бы немного другим, это было бы

Public Class clsConn
{
Public List<Data> getSomething()
    var SqlConn = new SqlConnection("your connection");
        try
        {
            SqlConn.Open();

            string sqlstring = "your sql sentence";

            SqlCommand SqlCmd = new SqlCommand(sqlstring, SqlConn);

            SqlDataReader reader = SqlCmd.ExecuteReader();

            List<Data> dataList = new List<Data>();

            if (reader.Read())
            {
                    Data data = new Data();
                    data.productid = reader[0].ToString(); // this is just an example
                    dataList.Add(data);
            }
            return dataList;
        }
        catch (Exception ex)
        {
            MessageBox.Show("conexion to DB failed: " + ex.Message);
            throw;
        }
        finally
        {
            SqlConn.Close();

        }
    }
  }
 }

И у вас должен быть общедоступный класс данных, который имеет все необходимые вам свойства, например, такие

public class Data
{
    public string productid { get; set; }
}

Чтобы использовать его, вы должны работать так

    List<Data> dbData = new List<Data>();
    clsConn db = new clsConn();
    dbData = db.getSomething();
    //I ll leave the foreach but as I said this should be only one result
    foreach (var item in DBData) 
    {
        dataGridView1.Rows.Add(item.productid);
    }

Я использую ваш код, но когда я запускаю его, появляется ошибка подключения.

LauTan 29.01.2019 04:57

Можете ли вы показать мне обновленный код, который вы используете, используя мой?

nalnpir 29.01.2019 13:30

Извини брат. я использую другой метод

LauTan 29.01.2019 14:02

Ваш вызов .Insert() не предоставляет строку для вставки, и вы не обрабатываете индекс, возвращаемый вызовом Rows.Add().

Я немного отредактировал ваш код, так что теперь он должен работать.

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if ((e.KeyCode != Keys.Enter) || (textBox1.Text.Length == 0))
    {
        return;
    }

    conn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=F:\Database\book1.mdf;Integrated Security=True;Connect Timeout=30");
    conn.Open();
    SqlDataAdapter adp = new SqlDataAdapter("SELECT productid,ProductName,Description,Stock,UOM,Price from ProductTable where productId='" + textBox1.Text + "'", conn);
    DataTable dt = new DataTable();
    adp.Fill(dt);

    foreach (DataRow item in dt.Rows)
    {
        int i = dataGridView1.Rows.Add();
        DataGridViewRow row = dataGridView1.Rows[i];
        row.Cells[0].Value = item[0].ToString();
        row.Cells[1].Value = item[1].ToString();
        row.Cells[2].Value = item[2].ToString();
        row.Cells[3].Value = item[3].ToString();
        row.Cells[4].Value = item[4].ToString();
        row.Cells[5].Value = item[5].ToString();
    }
}

И не забудьте закрыть соединение с базой данных. Рассмотрите возможность использования для этого инструкции using.

Вы также должны проверить это: Как программно добавить новую строку в datagridview

Я следую вашему коду, но также не могу запустить, он также может сканировать только один

LauTan 29.01.2019 03:17

я просто добавляю это (textBox4.Text = " ";) после закрытия соединения, он показывает сканер и может добавить строку, но может сканировать только однозначное число, так как я могу сканировать многозначный штрих-код?

LauTan 29.01.2019 14:04

Другие вопросы по теме