keydown事件无法在datagridview中添加项目

时间:2019-01-28 12:04:55

标签: c#

当我使用扫描仪扫描条形码时,
该项目将添加到第一行,当我扫描第二个条形码时,
该项目不会在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();
                    }
                }
            }
        }

页面截图:

2 个答案:

答案 0 :(得分:0)

如果您的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);
    }

答案 1 :(得分:0)

您的.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语句。

您还应该检查以下内容:How to add a new row to datagridview programmatically