im 在 Windows 窗体应用程序上工作,该应用程序允许用户以编程方式(更新单元格值一次)和手动(逐个更新)更新数据库。该过程在 Maual 更新中运行良好,但是当它尝试以编程方式更新时,只会保存一些更改。
当我在以编程方式更改后查看 datagridview 时,我可以看到值已更改,但是当我关闭程序并再次打开它时,只剩下一些更改。
奇怪的是,当我在关闭列标题之前对值进行排序时(值是日期),某些日期不按顺序排列。这些相同的日期是未保存到数据库中的日期。
我该如何解决这个问题?如何保存所有更改?
这是我的相关代码:
private void save_btn_Click(object sender, EventArgs e)
{
dataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically;
string t = "";
Label l;
int space;
for (int c = 1; c < tableLayoutPanel1.ColumnCount; c++)
{
for (int r = 1; r < tableLayoutPanel1.RowCount; r++)
{
l = (Label)tableLayoutPanel1.GetControlFromPosition(c, r);
if (l != null)
{
t = l.Text;
for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
{
if (dataGridView1[2, i].Value.ToString().Equals(t))
{
dataGridView1[4, i].Value = GetDate();
}
}
}
}
}
bindingSource1.EndEdit();
dataAdapter.Update((DataTable)bindingSource1.DataSource);
dataGridView1.EditMode = DataGridViewEditMode.EditOnKeystrokeOrF2;
}
编辑:手动更新代码:
private void saveDB_Btn_Click(object sender, EventArgs e)
{
try
{
bindingSource1.EndEdit();
dataAdapter.Update((DataTable)bindingSource1.DataSource);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
将数据网格视图绑定到数据库代码:
void GetData(string selectCommand)
{
try
{
dataAdapter = new SqlCeDataAdapter(selectCommand, conn);
commandBuilder = new SqlCeCommandBuilder(dataAdapter);
table = new DataTable();
dataAdapter.Fill(table);
bindingSource1.DataSource = table;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
尽管您在编辑后添加了其他代码,但很难确切地说出发生了什么,因为仍然缺少一些相关代码,例如 GetDate()
方法、排序代码和 * 中的 TableLayoutPanel 代码。设计器.cs文件。
在调试会话期间很容易找到根本原因;首先,检查是否遗漏了未存储在Label
控件中的值(如果有)。这可以通过在第一个if
语句中添加一个空的else
子句并在那里放置一个断点来完成,看看它是否命中。
第一个 if
语句中的断点可以告诉您是否看到 UI 上显示的所有值。只需在if
内放置一个断点并检查Label.Text
即可。
最后但并非最不重要的一点是,您可以检查第二个if
语句。由于您要将表布局面板的标签文本与 DGV 文本进行比较,因此可能存在不匹配,从而导致某些值无法更新。这可以通过单步执行最内部子句中的代码来完成,并确保应匹配的所有标签确实匹配。
希望这有帮助。