【问题标题】:How to edit data in search result in c#如何在C#中编辑搜索结果中的数据
【发布时间】:2018-04-04 14:53:48
【问题描述】:

我设法为我的编辑按钮和搜索按钮创建了一个代码。我的编辑按钮功能正常。它可以编辑我在数据库中的数据,我的搜索代码也可以使用。我的问题是编辑搜索结果中的数据。就像我搜索“火影忍者”一样,我的 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();
    }

【问题讨论】:

  • 您是否在同一页面中编辑一行?不要将所有代码都塞进一页。应用关注点分离。当您点击搜索时,它将使用“火影忍者”过滤这些记录,然后当您单击要更新的记录时,获取该记录的 ID(主键)并将其带到另一个页面进行编辑。这样,您就可以更轻松地找出问题所在。
  • 同页是什么意思?喜欢同一张桌子?如果您指的是表,那么是的。什么是关注点分离?你有任何样品可以帮助解决我的问题吗?
  • 我的意思是,当您点击您处于编辑模式时,您是在同一个窗口中执行此操作还是正在加载另一个窗口来编辑记录?关注点分离意味着,我有一个单独的页面/窗口用于添加记录,然后是另一个单独的页面/窗口用于编辑,然后是另一个用于删除,另一个用于搜索列表(带有 datagridview 的窗口)。这样,我就不会将所有代码都塞进一个窗体/页面中,从而更容易分析和调试
  • 在同一个窗口中加载它。我的保存、删除和编辑都是同一个窗口,只有一个datagridview。

标签: c# database search datagridview edit


【解决方案1】:

如果不查看更多代码,很难更具体,但核心问题至少部分是您没有在查询结果和数据库查询之间使用 MVVM(模型视图视图模型)或 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 的一些 value 并将其与 dt 中的一行匹配。然后,您可以针对正确的行构建更新查询。

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

【讨论】:

  • 我不熟悉那个 MVVM。也许我认为我只需要更改 CurrentRow.Index ... 只是猜测,因为当我在搜索结果中编辑一些数据时,我数据库中的第一个数据是正在改变的数据,而不是我从搜索结果中选择的数据。
  • MVVM 是编写此类代码的正确方法,因为它使所有代码编写起来更快、更容易。你应该找到它的教程并学习它。
  • 我的回答解释了为什么您不更新数据库中要更新的行。 JOGridView 的“CurrentRow.Index”永远不会是您想要在数据库中的行,因为您的视图和查询中的行没有连接。您的代码中没有任何内容可以将视图中的行索引与数据库中的行匹配。
猜你喜欢
  • 1970-01-01
  • 2016-12-16
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多