我有一个DataGridView,它显示从数据库中检索的项目列表。很少使用点击行的值更新的文本框和创建类实例的更新(btnAzuriraj)按钮,然后更新数据库并刷新数据网格视图。
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0)
{
DataGridViewRow row = this.dataGridView1.Rows[e.RowIndex];
tbID.Text = row.Cells[0].Value.ToString();
tbIme.Text = row.Cells[1].Value.ToString();
tbPrezime.Text = row.Cells[2].Value.ToString();
tbAdresa.Text = row.Cells[3].Value.ToString();
tbTelefon.Text = row.Cells[4].Value.ToString();
if (row.Cells[5].Value.ToString() == "0")
{
cbPol.SelectedIndex = 0;
}
else
{
cbPol.SelectedIndex = 1;
}
dtbDatumRodjenja.Value = Convert.ToDateTime(row.Cells[6].Value.ToString());
}
//pacijent = new Pacijent(tbID.Text, tbIme.Text, tbPrezime.Text, tbAdresa.Text, tbTelefon.Text, cbPol.SelectedIndex, dtbDatumRodjenja.Value.Date.ToShortDateString());
}
private void btnAzuriraj_Click(object sender, EventArgs e)
{
pacijent = new Pacijent(tbID.Text, tbIme.Text, tbPrezime.Text, tbAdresa.Text, tbTelefon.Text, cbPol.SelectedIndex, dtbDatumRodjenja.Value.Date.ToShortDateString());
try
{
konekcija.Open();
using (SqlCommand sql = new SqlCommand("UPDATE pacijent SET ime=@Ime, prezime=@Prezime, adresa=@Adresa, telefon=@Telefon, pol=@Pol, datumRodjenja=@DatumRodjenja WHERE id=@ID", konekcija))
{
sql.Parameters.Add(new SqlParameter("Ime", pacijent.Ime));
sql.Parameters.Add(new SqlParameter("Prezime", pacijent.Prezime));
sql.Parameters.Add(new SqlParameter("Adresa", pacijent.Adresa));
sql.Parameters.Add(new SqlParameter("Telefon", pacijent.Telefon));
sql.Parameters.Add(new SqlParameter("Pol", pacijent.Pol));
sql.Parameters.Add(new SqlParameter("DatumRodjenja", pacijent.DatumRodjenja));
sql.Parameters.Add(new SqlParameter("ID", pacijent.Id));
sql.ExecuteNonQuery();
ocistiPodatke();
ucitajListuPacijenata();
MessageBox.Show("Podaci o pacijentu " + pacijent.Ime + " " + pacijent.Prezime + " su uspesno azurirani.");
}
}
所有这些都运行良好,但请注意Cellclick方法中的注释部分。当我想更改其实例Pacijent类在Cellclick方法而不是btnAzuriraj_Click时,它将不会使用最新值更新数据库。为什么呢?
基本上我想要实例化一个类,并且每次单击DataGridView中的行时都要用不同的值填充它,而不仅仅是在我想要更新数据库时。我想这样做是因为我想将类值用于别的东西,而不仅仅是用于数据库更新。
问题更新。我甚至尝试在e.RowIndex >=0
语句中实例化一个类。并检查它是否实际存储并从类对象中检索值。所有这些工作正常,但它不会更新数据库。
答案 0 :(得分:0)
它是什么意思'它不会工作' ? pacijent
未实例化 - 在其属性上获取空值而不是某些适当的值?
也许是因为您从
中实例化了pacijent
if (e.RowIndex >= 0)
{
}
子句,而Pacijent
构造函数中使用的数据的初始化是在if() { }
子句中完成的。
答案 1 :(得分:0)
看起来我忘了编辑类实例中文本框的最新值。所以看起来应该是这样的。
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0)
{
DataGridViewRow row = this.dataGridView1.Rows[e.RowIndex];
tbID.Text = row.Cells[0].Value.ToString();
tbIme.Text = row.Cells[1].Value.ToString();
tbPrezime.Text = row.Cells[2].Value.ToString();
tbAdresa.Text = row.Cells[3].Value.ToString();
tbTelefon.Text = row.Cells[4].Value.ToString();
if (row.Cells[5].Value.ToString() == "0")
{
cbPol.SelectedIndex = 0;
}
else
{
cbPol.SelectedIndex = 1;
}
dtbDatumRodjenja.Value = Convert.ToDateTime(row.Cells[6].Value.ToString());
pacijent = new Pacijent(tbID.Text, tbIme.Text, tbPrezime.Text, tbAdresa.Text, tbTelefon.Text, cbPol.SelectedIndex, dtbDatumRodjenja.Value.Date.ToShortDateString());
}
}
private void btnAzuriraj_Click(object sender, EventArgs e)
{
//pacijent = new Pacijent(tbID.Text, tbIme.Text, tbPrezime.Text, tbAdresa.Text, tbTelefon.Text, cbPol.SelectedIndex, dtbDatumRodjenja.Value.Date.ToShortDateString());
pacijent.Id = tbID.Text;
pacijent.Ime = tbIme.Text;
pacijent.Prezime = tbPrezime.Text;
pacijent.Adresa = tbAdresa.Text;
pacijent.Pol = cbPol.SelectedIndex;
pacijent.DatumRodjenja = dtbDatumRodjenja.Value.Date.ToShortDateString();
try
{
konekcija.Open();
using (SqlCommand sql = new SqlCommand("UPDATE pacijent SET ime=@Ime, prezime=@Prezime, adresa=@Adresa, telefon=@Telefon, pol=@Pol, datumRodjenja=@DatumRodjenja WHERE id=@ID", konekcija))
{
sql.Parameters.Add(new SqlParameter("Ime", pacijent.Ime));
sql.Parameters.Add(new SqlParameter("Prezime", pacijent.Prezime));
sql.Parameters.Add(new SqlParameter("Adresa", pacijent.Adresa));
sql.Parameters.Add(new SqlParameter("Telefon", pacijent.Telefon));
sql.Parameters.Add(new SqlParameter("Pol", pacijent.Pol));
sql.Parameters.Add(new SqlParameter("DatumRodjenja", pacijent.DatumRodjenja));
sql.Parameters.Add(new SqlParameter("ID", pacijent.Id));
sql.ExecuteNonQuery();
ocistiPodatke();
ucitajListuPacijenata();
MessageBox.Show("Podaci o pacijentu " + pacijent.Ime + " " + pacijent.Prezime + " su uspesno azurirani.");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
konekcija.Close();
}
}