2

Form1にグリッドビューとテキストボックスがあります。Form1がロードされると、データベースからGridviewにデータがロードされます。データがテキストボックスに入るグリッドビューのselectionChangedイベントがあり、テキストボックスで編集してデータベースに保存したいのですが、保存ボタンをクリックすると、データベースとグリッドビューに新しいレコードが作成されます。 。これを修正する方法は?

以下は、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();
        }
    }
}
4

4 に答える 4

0
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);
}
于 2013-02-06T12:22:22.177 に答える
0

クエリに WHERE 条件がありません

da = new SqlDataAdapter("select * from Measurement WHERE ID = " + txtID.Text, con);
于 2013-02-06T11:26:16.353 に答える
0

あなたが見なければならないのは、データベースに保存する方法です。

現在起こっていることは、既にロードしたものを更新するのではなく、データベースに新しいエンティティ/行を挿入していることです。

主キー フィールドがありません。ID。したがって、既存の更新が必要なエンティティではなく、常に新しいエンティティを追加します。

于 2013-02-06T11:26:33.897 に答える
0

da.Update(ds, "Measurement");セル値を新しい行に割り当てているため、RowState更新しようとしている行のプロパティが設定されているため、新しいレコードを挿入しています。Added既存の行の値を更新する必要があります。DbDataAdapter.Update のドキュメントを確認してください:

アプリケーションが Update メソッドを呼び出すと、DbDataAdapter は RowState プロパティを調べ、必要な INSERT、UPDATE、または DELETE ステートメントを、DataSet で構成されたインデックスの順序に基づいて行ごとに繰り返し実行します。

これを試して :

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);
        }
    }


  }
于 2013-02-06T11:40:47.797 に答える