C# 如何在c中编辑搜索结果中的数据#

C# 如何在c中编辑搜索结果中的数据#,c#,database,search,datagridview,edit,C#,Database,Search,Datagridview,Edit,我设法为我的编辑按钮和搜索按钮创建了一个代码。我的编辑按钮功能正常。它可以编辑我的数据库中的数据,我的搜索代码也是功能性的。我的问题是编辑搜索结果中的数据。就像我搜索“鸣人”一样,我的datagridview会过滤数据库中所有有“鸣人”的名字。选择并双击结果后,所有数据将重新显示到我的文本框中。但当我编辑这些数据时,它不起作用。相反,数据库中的第一个数据是正在更改的数据,而不是我选择的数据。如果我不搜索任何姓名,也不在搜索结果上选择,则我的编辑代码将起作用 这是我的密码。请帮忙 private

我设法为我的编辑按钮和搜索按钮创建了一个代码。我的编辑按钮功能正常。它可以编辑我的数据库中的数据,我的搜索代码也是功能性的。我的问题是编辑搜索结果中的数据。就像我搜索“鸣人”一样,我的datagridview会过滤数据库中所有有“鸣人”的名字。选择并双击结果后,所有数据将重新显示到我的文本框中。但当我编辑这些数据时,它不起作用。相反,数据库中的第一个数据是正在更改的数据,而不是我选择的数据。如果我不搜索任何姓名,也不在搜索结果上选择,则我的编辑代码将起作用

这是我的密码。请帮忙

private void JOGridView_DoubleClick(object sender, EventArgs e)
    {
        DataTable dt = new DataTable();
        SqlDataAdapter da = new SqlDataAdapter("Select * from JobOrder", con);

        if (JOGridView.CurrentCell != null && JOGridView.CurrentCell.Value != null)
        {
            TBName.Text = JOGridView.SelectedRows[0].Cells[0].Value.ToString();
            TBContact.Text = JOGridView.SelectedRows[0].Cells[1].Value.ToString();
            CBStatus.Text = JOGridView.SelectedRows[0].Cells[2].Value.ToString();
            TBModel.Text = JOGridView.SelectedRows[0].Cells[3].Value.ToString();
            TBSerial.Text = JOGridView.SelectedRows[0].Cells[4].Value.ToString();
            TBAccess.Text = JOGridView.SelectedRows[0].Cells[5].Value.ToString();
            TBRB.Text = JOGridView.SelectedRows[0].Cells[6].Value.ToString();
            TBRP.Text = JOGridView.SelectedRows[0].Cells[8].Value.ToString();
            TBIT.Text = JOGridView.SelectedRows[0].Cells[10].Value.ToString();
            CBRamarks.Text = JOGridView.SelectedRows[0].Cells[11].Value.ToString();
            TBCharge.Text = JOGridView.SelectedRows[0].Cells[12].Value.ToString();
            TBRELB.Text = JOGridView.SelectedRows[0].Cells[13].Value.ToString();
        }
    }

 private void BTNEdit_Click(object sender, EventArgs e)
    {
        {
            DialogResult dr;
            dr = MessageBox.Show("Are you sure you want to Edit this record?", "Update Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            if (dr == DialogResult.Yes)
            {

                DataTable dt = new DataTable();
                SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM JobOrder", con);
                da.Fill(dt);

                dt.Rows[JOGridView.CurrentRow.Index].BeginEdit();


                dt.Rows[JOGridView.CurrentRow.Index][1] = TBName.Text;
                dt.Rows[JOGridView.CurrentRow.Index][2] = TBContact.Text;
                dt.Rows[JOGridView.CurrentRow.Index][3] = CBStatus.Text;
                dt.Rows[JOGridView.CurrentRow.Index][4] = TBModel.Text;
                dt.Rows[JOGridView.CurrentRow.Index][5] = TBSerial.Text;
                dt.Rows[JOGridView.CurrentRow.Index][6] = TBAccess.Text;
                dt.Rows[JOGridView.CurrentRow.Index][7] = TBRB.Text;
                dt.Rows[JOGridView.CurrentRow.Index][8] = DTDR.Text;
                dt.Rows[JOGridView.CurrentRow.Index][9] = TBRP.Text;
                dt.Rows[JOGridView.CurrentRow.Index][10] = DTDF.Text;
                dt.Rows[JOGridView.CurrentRow.Index][11] = TBIT.Text;
                dt.Rows[JOGridView.CurrentRow.Index][12] = CBRamarks.Text;
                dt.Rows[JOGridView.CurrentRow.Index][13] = TBCharge.Text;
                dt.Rows[JOGridView.CurrentRow.Index][14] = TBRELB.Text;
                dt.Rows[JOGridView.CurrentRow.Index][15] = DTDR.Text;

                dt.Rows[JOGridView.CurrentRow.Index].EndEdit();

                SqlCommandBuilder cb = new SqlCommandBuilder(da);
                da.Update(dt);


                displayrecords();

                MessageBox.Show("Selected record has been Updated!", "Done Updating ", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

            clearrecords();
        }
    }

    private void TBSearch_KeyUp(object sender, KeyEventArgs e)
    {
        if (TBSearch.Text == " ")
        {

        }
        else
            con.Open();
        SqlCommand cmd = con.CreateCommand();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "Select * from JobOrder where Name  like ('" + TBSearch.Text + "%')";
        cmd.ExecuteNonQuery();
        DataTable dt = new DataTable();
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(dt);
        JOGridView.DataSource = dt;

        con.Close();
    }

在没有看到更多代码的情况下很难更加具体,但核心问题至少在一定程度上是您没有在查询结果和数据库查询之间使用MVVM(model-view-viewmodel)或MVC样式的绑定

这就是为什么只更新表中的第一行,而不是所选行

//creates a new table not visible or linked anywhere
DataTable dt = new DataTable();
//gets every record in JobOrder
SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM JobOrder", con);
//fills the DataTable dt with all records from JobOrder
da.Fill(dt);

//uses the current index from the items in JOGridView to select a row in the unconnected/unrelated DataTable dt 
dt.Rows[JOGridView.CurrentRow.Index].BeginEdit();
dt.Rows[JOGridView.CurrentRow.Index][1] = TBName.Text;
如果您想让它以书面形式工作,您需要使用JOGridView.CurrentRow中的一些值,并将其与dt中的一行相匹配。然后可以针对正确的行构建更新查询


理想情况下,您将重新编写应用程序,以使用适当的MVVM样式绑定来自动完成所有连接。

是否在同一页面中编辑行?不要把所有代码塞进一页。应用关注点分离。当你点击搜索时,它会用“鸣人”过滤那些记录,然后当你点击你想要更新的记录时,获取该记录的ID(主键),并将其带到另一个页面进行编辑。这样,你就更容易指出哪里出了问题。你说的同一页是什么意思?喜欢同一张桌子吗?如果您所指的是表格,则是。什么是关注点的分离?你有什么样的例子可以帮我解决问题吗?我的意思是,当你点击时,你处于编辑模式,你是在同一个窗口上做的,还是在加载另一个窗口来编辑记录?关注点分离意味着,我有一个单独的页面/窗口用于添加记录,然后是另一个单独的页面/窗口用于编辑,然后是另一个页面/窗口用于删除,另一个用于搜索列表(带有datagridview的窗口)。这样,我就不会把所有的代码都塞进一个windows窗体/页面,更容易在同一个窗口中分析和调试。我的保存、删除和编辑都是同一个窗口,只有一个datagridview。我不熟悉那个MVVM。也许我想我只需要更改CurrentRow.Index。。。只是猜测一下,因为当我编辑搜索结果中的某些数据时,数据库中的第一个数据是正在更改的数据,而不是我从搜索结果中选择的数据。MVVM是编写类似代码的正确方法,因为它使所有内容都更快、更易于编写。你应该找到一个关于它的教程并学习它。我的答案解释了为什么你不更新数据库中要更新的行。JOGridView的“CurrentRow.Index”永远不会是数据库中所需的行,因为视图中的行与查询中的行没有连接。代码中没有任何内容可以将视图中的行索引与数据库中的行相匹配。