C# 如何获取文本框,编辑它们并将它们保存回数据库?

C# 如何获取文本框,编辑它们并将它们保存回数据库?,c#,winforms,C#,Winforms,我有一个gridview和Form1中的文本框。当Form1加载时,它会将数据从数据库加载到Gridview中。我有一个selectionChanged事件Gridview,数据从中进入文本框,现在我的问题是我想在文本框中编辑它们并将它们保存到数据库,但当我单击save按钮时,它正在数据库和Gridview中创建一条新记录。如何解决这个问题 下面是我的SaveButton代码: private void btnSave_Click_1(object sender, EventArgs e) {

我有一个gridview和Form1中的文本框。当Form1加载时,它会将数据从数据库加载到Gridview中。我有一个selectionChanged事件Gridview,数据从中进入文本框,现在我的问题是我想在文本框中编辑它们并将它们保存到数据库,但当我单击save按钮时,它正在数据库和Gridview中创建一条新记录。如何解决这个问题

下面是我的SaveButton代码:

private void btnSave_Click_1(object sender, EventArgs e)
{
    DataRow dr = dt.NewRow();
    da = new SqlDataAdapter("select * from Measurement", con);
    SqlCommandBuilder cb = new SqlCommandBuilder(da);
    dr["CellNumber"] = txtCellNo.Text.Trim();
    dr["FirstName"] = txtFirstName.Text;
    dr["LastName"] = txtLastName.Text;
    dr["Shirt"] = txtShirt.Text;
    dr["Pant"] = txtPant.Text;
    dr["DueDate"] = txtDueDate.Text;
    dr["Date"] = txtDate.Text;
    if (dr["CellNumber"] == "")
    {
        MessageBox.Show("Please enter Cell Number");
    }
    else if (dr["CellNumber"] != "")
    {
        dr = dt.Select(" ID = " + txtID.Text)[0]; //updated here
    }

    try
    {
        da.Update(ds, "Measurement");
    }
    catch (DBConcurrencyException ex)
    {
        MessageBox.Show(ex.Message);
    }
}
Gridview的代码:

private void dgv_SelectionChanged_1(object sender, EventArgs e)
{
    if (dgv.SelectedRows.Count > 0)
    {

        foreach (DataGridViewRow row in dgv.SelectedRows)
        {
            //Send the first cell value into textbox'
            txtLastName.Text = row.Cells["LastName"].Value.ToString();
            txtFirstName.Text = row.Cells["FirstName"].Value.ToString();
            txtCellNo.Text = row.Cells["CellNumber"].Value.ToString();
            txtDate.Text = row.Cells["Date"].Value.ToString();
            txtDueDate.Text = row.Cells["DueDate"].Value.ToString();
            txtPant.Text = row.Cells["Pant"].Value.ToString();
            txtShirt.Text = row.Cells["Shirt"].Value.ToString();
            txtID.Text = row.Cells["ID"].Value.ToString();
        }
    }
}

查询中缺少WHERE条件

da = new SqlDataAdapter("select * from Measurement WHERE ID = " + txtID.Text, con);

您应该了解如何将数据保存到数据库中

现在的情况是在数据库中插入一个新的实体/行,而不是更新已经加载的实体/行

缺少主键字段。ID。因此,它将始终是一个新实体,以添加不存在且需要更新的实体。

da.Update(ds,“度量”)
正在插入新记录,因为要更新的行的
RowState
属性设置为
Added
,因为您正在将单元格值分配给新行。您需要更新现有行的值。检查:

当应用程序调用Update方法时,DbDataAdapter 检查RowState属性,并执行所需的插入, 根据 数据集中配置的索引的顺序

试试这个:

private void btnSave_Click_1(object sender, EventArgs e)
{
    da = new SqlDataAdapter();
    da.SelectCommand = new SqlCommand("select * from Measurement where ID = @ID",con);
    da.SelectCommand.Parameters.AddWithValue("@ID",int.Parse(txtID.Text));
    SqlCommandBuilder cb = new SqlCommandBuilder(da);
    da.Fill(ds, "Measurement");        

    if (String.IsNullOrEmpty(txtCellNo.Text.Trim()))
    {
        MessageBox.Show("Please enter Cell Number");
    }
    else
    {
        try
        {
           dr = ds.Tables["Measurement"].Rows[0];

           dr["CellNumber"] = txtCellNo.Text.Trim();
           dr["FirstName"] = txtFirstName.Text;
           dr["LastName"] = txtLastName.Text;
           dr["Shirt"] = txtShirt.Text;
           dr["Pant"] = txtPant.Text;
           dr["DueDate"] = txtDueDate.Text;
           dr["Date"] = txtDate.Text;

           cb.GetUpdateCommand();
           da.Update(ds, "Measurement");
        }
        catch (Exception ex)
        {
           MessageBox.Show(ex.Message);
        }
    }


  }

您是对的,但我不确定在尝试编辑时如何绑定主键。它只是添加了一个新的ID,因为后端中的ID列被设置为自动递增。我知道我必须弄清楚如何根据ID键编辑数据,但我不想使用组合框。我该怎么办?@KiritiK您只需在DataRow中加载ID以及所有其他数据我正在使用Sql命令生成器进行插入、更新和删除。如果我把ID作为where条件,它只是基于ID加载数据,但如果我没有错,我想要的是基于ID更新数据?dt.select()没有影响。我已经更新了密码。看看我做得对不对?它显示错误“无法隐式转换System.Data.DataRow[]到System.Data.DataRow。我试着像你说的那样将代码放在Save按钮中。好的,我试过dt。按你说的选择,现在它没有添加新行是好的,但当我单击Save按钮时它没有更新更改。这给了我错误,说System.Data.DataTable不包含“Tables”的定义,也没有扩展方法“Tables”accep在这一行dr=da.Tables[“Measurement”];行[0];@KiritiK这是一个错误,它应该是ds而不是da。更新应答非常感谢。现在编辑模式正在工作,但在da.Fill添加新记录时抛出错误(ds,“Measurement”)。错误是将数据类型nvarchar转换为数值时出错。dr=dt.Select(“ID=”+txtID.Text)[0];语法错误:在“=”运算符后缺少操作数。谢谢,现在编辑模式正在工作,但在单击“保存”时无法添加新记录。当我尝试添加新记录时,它会引发如上所述的错误:(对于新行,您上面提到的方法将起作用……。您只需检查其更新或新模式,根据您的代码是否会更改。对于新插入,您需要“DataRow dr=dt.NewRow();”,它在“=”运算符后表示缺少操作数。使用dt.NewRow()添加新行时;
da = new SqlDataAdapter("select * from Measurement", con);
SqlCommandBuilder cb = new SqlCommandBuilder(da);
dr = dt.Select(" ID = " + txtID.Text)[0];

if (txtCellNo.Text == "")
{
    MessageBox.Show("Please enter Cell Number");
}
else if (dr["CellNumber"] != "")
{
    dr["CellNumber"] = txtCellNo.Text.Trim();
    dr["FirstName"] = txtFirstName.Text;
    dr["LastName"] = txtLastName.Text;
    dr["Shirt"] = txtShirt.Text;
    dr["Pant"] = txtPant.Text;
    dr["DueDate"] = txtDueDate.Text;
    dr["Date"] = txtDate.Text;
}

try
{
    da.Update(ds, "Measurement");
}
catch (DBConcurrencyException ex)
{
    MessageBox.Show(ex.Message);
}