Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么它可以';当我点击包含更新代码的按钮时,我不会更新数据库_C#_Winforms_Visual Studio - Fatal编程技术网

C# 为什么它可以';当我点击包含更新代码的按钮时,我不会更新数据库

C# 为什么它可以';当我点击包含更新代码的按钮时,我不会更新数据库,c#,winforms,visual-studio,C#,Winforms,Visual Studio,我有一个DataGridView,它显示从数据库检索的项目列表。使用单击行的值和更新(btnAzuriraj)按钮更新的几个文本框,这些按钮创建类的实例,然后更新数据库并刷新数据网格视图 private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex >= 0) { DataGridViewRow row = this.dat

我有一个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方法中的注释部分。当我想改变它在Cellclick方法中引用Pacijent类的位置而不是btnAzuriraj_单击时,它不会用最新的值更新数据库。为什么?

基本上,我希望在每次单击DataGridView中的行时都实例化一个类并用不同的值填充它,而不仅仅是在我希望更新DB时。我之所以要这样做,是因为我想将类值用于其他用途,而不仅仅是用于DB更新


问题更新。我甚至尝试在
e.RowIndex>=0
语句中实例化一个类。并检查它是否实际存储和检索类对象中的值。除了不会更新数据库外,所有这些都正常工作。

这是什么意思
pacijent
未实例化-在其属性上获取null而不是一些正确的值

可能是因为您在

如果(e.RowIndex>=0)
{ 
}


子句,而
Pacijent
构造函数中使用的数据的初始化是在
if(){}
子句中完成的。

看起来我忘记了从类实例中的文本框编辑到最新的值。所以应该是这样的

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();
    }
}

我也尝试在该语句中引用该类。当我说它不会工作时,我的意思是它不会用最新的值更新数据库。您正在使用
pacijent
对象更新数据库中的值,对吗?也许您的
pacijent
对象的ID属性是0,因此更新查询不起作用?运行更新数据库查询时,检查
pacijent.ID
是否不等于0。如果是,则更新pacijent对象中的值。我在btnAzuriraj中输出MessageBox以检查pacijent.ID的值,它工作正常,并根据单击的行显示正确的值。它不会工作。这不是一个有用的问题描述@TaW,我已经更新了描述和问题。如果它需要更新数据库,那么您还需要在CellClick中包含您在button click中使用的代码(除非Pacijent在每次创建时都这样做).好的,我认为标题现在是错误的,因为根据其他人的建议,我意识到它很好地引用了一个类,但问题是在您单击btnAzurirajUpdate之后更新数据库。当我在button click方法中创建一个类的实例时,更新代码起作用。但当我在单元格内创建实例时,单击方法将不起作用。我已经测试了button click方法是否可以从pacijent对象中检索值,结果是否正常。