我正在开发一个Windows窗体应用程序,允许用户更新数据库programmaticaly(更新单元格值一次)和manualy(逐个更新)。 该过程在maual更新中运行正常,但是当它尝试更新programmaticaly时,只保存了一些更改。
当我在programmaticaly更改后查看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);
}
}
将Datagridview绑定到数据库代码:
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);
}
}
答案 0 :(得分:0)
尽管您在编辑后添加了额外的代码,但很难确切知道发生了什么,因为仍然缺少某些相关代码,例如GetDate()
方法,排序代码以及TableLayoutPanel在* .Designer.cs文件中的代码。
在调试会话期间找到根本原因很容易;首先,检查是否遗漏了未存储在Label
控件中的值(如果有)。这可以通过向第一个 else
语句添加一个空的if
子句并在那里放置断点来完成,看看它是否命中。
第一个 if
语句中的断点 可以告诉您是否看到UI上显示的所有值。只需在if
中放置一个断点并检查Label.Text
。
最后但并非最不重要的是,您可以检查第二个 if
语句。由于您将TableLayoutPanel的标签文本与DGV文本进行比较,因此可能存在不匹配导致某些值无法更新。这可以通过逐步执行最内部子句中的代码来完成,并确保所有应匹配的标签确实匹配。
希望这有帮助。