Когда я использую сканер для сканирования штрих-кода,
элемент будет добавлен в первую строку, и когда я отсканирую второй штрих-код,
элемент не будет добавлен в 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();
}
}
}
}
Скриншоты страницы:
потому что в моем представлении данных добавлена кнопка удаления, ячейка общей суммы, поэтому, когда я сканирую второй штрих-код, это будет кнопка удаления... только строка, без данных, которые я сканирую





Ваш подход, если ваш 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);
}
Я использую ваш код, но когда я запускаю его, появляется ошибка подключения.
Можете ли вы показать мне обновленный код, который вы используете, используя мой?
Извини брат. я использую другой метод
Ваш вызов .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
Я следую вашему коду, но также не могу запустить, он также может сканировать только один
я просто добавляю это (textBox4.Text = " ";) после закрытия соединения, он показывает сканер и может добавить строку, но может сканировать только однозначное число, так как я могу сканировать многозначный штрих-код?
Не добавляется в DGV, но добавляется строка? Я не уверен, что понимаю эту часть. Разве ты не хочешь новый ряд?