首页 文章

更新时如何刷新数据网格视图?来自C#的窗口

提问于
浏览
1

我试图在用户将一些项目插入数据库后刷新数据网格视图 . 我试图取消视图的数据源并为其应用新的数据源,但它不起作用 .

这是系统的流程:

  • 点击添加项目,然后弹出一个 add-item form

  • 输入产品详细信息,然后单击按钮以插入数据

  • 查看更新<-----问题

enter image description here

在这部分中,将有 two forms 和一个 database claee . 它们是 Form1 (数据视图), Add-item formdatabase_function.cs .

这是我在 database class 上的代码:

public class database_function
{
   OleDbConnection connect = new OleDbConnection();


    public database_function()
    {
        connect.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\sys_db.accdb";
    }

    public void database_connect(String item_code, String des, String unit, double price)
    {
      Form1 f1 = new Form1();
        try
        {

            connect.Open();
            OleDbCommand command = new OleDbCommand();
            command.Connection = connect;
            command.CommandText = "INSERT into item (item_code, description, unit, price) values ('" + item_code + "', '" + des + "', '" + unit + "', " + price + ")";
            command.ExecuteNonQuery();

            connect.Close();
        }
        catch(Exception e)
        {
            Debug.WriteLine(e.Source);
            connect.Close();
        }
       f1.refresh_dataGridView();
    }



    //return the dataGridView to form 1, and show the database data on it.
    public DataTable get_view()
    {
        connect.Open();
        OleDbCommand command = new OleDbCommand();
        command.Connection = connect;
        string query = "Select item_code, description, unit, price from item";
        command.CommandText = query;

        OleDbDataAdapter da = new OleDbDataAdapter(command);
        DataTable dt = new DataTable();
        da.Fill(dt);
        connect.Close();
        Debug.WriteLine("return dataTable");
        return dt;
    }
}

以下是 form1 上的代码://当form1加载私有时获取数据源void Form1_Load(object sender,EventArgs e)

//Refresh the view
   public void refresh_dataGridView()
    {
        dataGridView1.DataSource = null;
        dataGridView1.DataSource = df.get_view();
        Debug.WriteLine("refuesh");
    }

这是 add-item. form

private void button1_Click(object sender, EventArgs e)
    {
       //Get textfield data....

        //If user doesn't input the item data, show the error message. Else, update to database.
        if (error == true)
        {
            error_msg_form emf = new error_msg_form();
            emf.Show();
        }
        else
        {
            Form1 f1 = new Form1();
            database_function df = new database_function();
             df.database_connect(item_code_tb.Text, des_tb.Text, unit_tb.Text, Convert.ToDouble(unit_price_tb.Text));
            //f1.refresh_dataGridView();
        }
    }

但是,我调试日志会显示 refresh ,这意味着它可以在 refresh_dataGridView() 中运行 . 但它无法刷新视图 .

有什么问题呢?或者有另一种方法可以做到这一点?谢谢

4 回答

  • 0

    当您调用 database_connect 方法时,使用 this 传递下面的表单引用,

    private void button1_Click(object sender, EventArgs e)
    {
       //Get textfield data....
    
        //If user doesn't input the item data, show the error message. Else, update to database.
        if (error == true)
        {
            error_msg_form emf = new error_msg_form();
            emf.Show();
        }
        else
        {
            //Form1 f1 = new Form1();
            database_function df = new database_function();
             df.database_connect(this, item_code_tb.Text, des_tb.Text, unit_tb.Text, Convert.ToDouble(unit_price_tb.Text));
            //f1.refresh_dataGridView();
        }
    }
    

    然后,在方法中添加参数 Form1 form1 ,如下所示,并使用相同的引用调用 form1.refresh_dataGridView() .

    public void database_connect(Form1 form1, String item_code, String des, String unit, double price)
        {
          //Form1 f1 = new Form1();
            try
            {
    
                connect.Open();
                OleDbCommand command = new OleDbCommand();
                command.Connection = connect;
                command.CommandText = "INSERT into item (item_code, description, unit, price) values ('" + item_code + "', '" + des + "', '" + unit + "', " + price + ")";
                command.ExecuteNonQuery();
    
                connect.Close();
            }
            catch(Exception e)
            {
                Debug.WriteLine(e.Source);
                connect.Close();
            }
           form1.refresh_dataGridView();
        }
    

    另外,更改以下代码以刷新数据网格视图,

    public void refresh_dataGridView()
        {
            dataGridView1.DataSource = typeof(List);
            dataGridView1.DataSource = df.get_view();
            Debug.WriteLine("refuesh");
        }
    
  • 2

    您最好重构代码并将数据库访问代码分离到单独的类文件中 . 然后你可以从其他类,表单等调用这些函数 .

    在插入项方法之后的表单中,您可以设置gridview数据源,例如:

    database_function df = new database_function();
    df.InsertItem("sdfsdf", "Description", "KG", 5);
    //load data again
    dataGridView1.DataSource = df.get_view();
    

    你需要两个方法,一个用于插入,一个用于获取详细信息

    public class database_function
    {
         public void InsertItem(String item_code, String des, String unit, double price)
            {
               //Form1 f1 = new Form1();
                try
                {
                    connect.Open();
                    OleDbCommand command = new OleDbCommand();
                    command.Connection = connect;
                    command.CommandText = "INSERT into item (item_code, description, unit, price) values ('" + item_code + "', '" + des + "', '" + unit + "', " + price + ")";
                    command.ExecuteNonQuery();
    
                    connect.Close();
                }
                catch(Exception e)
                {
                    Debug.WriteLine(e.Source);
                    connect.Close();
                }
             //f1.refresh_dataGridView();
            }
    
     public DataTable get_view()
        {
            connect.Open();
            OleDbCommand command = new OleDbCommand();
            command.Connection = connect;
            string query = "Select item_code, description, unit, price from item";
            command.CommandText = query;
    
            OleDbDataAdapter da = new OleDbDataAdapter(command);
            DataTable dt = new DataTable();
            da.Fill(dt);
            connect.Close();
            return dt;
        }
    

    }

  • 0

    这是我用于我的代码:

    private void Form1_Activated(object sender, EventArgs e) {
            if (GlobalVariables.bReload == false) {
                Activated -= Form1_Activated;
                GlobalVariables.bReload = true;
                dgv1.DataSource = "my datasource"
                dgv1.Refresh();
                Activated += Form1_Activated;
            }
        }
    

    在我的情况下,我想在对子窗体进行修改之后触发更新,然后返回到我的datagridview所在的主窗体 . 我使用布尔类型的全局变量来管理它 .

  • 1

    我假设当项目已插入数据库时,您关闭“AddItem”表单 . 我建议在不传递引用的情况下更明确地通知成功插入,并通过将其公开来暴露表单的控制

    根据查询结果更改 database_connect 方法返回 true/false

    public void database_connect(String item_code, String des, String unit, double price)
    {
        try
        {
            connect.Open();
            OleDbCommand command = new OleDbCommand();
            command.Connection = connect;
            command.CommandText = "INSERT into item (item_code, description, unit, price) values ('" + item_code + "', '" + des + "', '" + unit + "', " + price + ")";
            int insertedRows = command.ExecuteNonQuery();
    
            return insertedRows > 0;
        }
        catch(Exception e)
        {
            Debug.WriteLine(e.Source);
        }
        finally
        {
            connect.Close();
        }
    
        // false will be returned if exception will be thrown
        return false;
    }
    

    然后在 AddItem 表单中将 Form.DialogResult 属性设置为 Ok 如果已成功添加项目 .

    public class AddNewItemForm : Form
    {
        private void button1_Click(object sender, EventArgs e)
        {
            if (error == true)
            {
                error_msg_form emf = new error_msg_form();
                emf.Show();
            }
            else
            {
                database_function df = new database_function();
                bool isAdded = df.database_connect(item_code_tb.Text,
                                                   des_tb.Text, 
                                                   unit_tb.Text,
                                                   Convert.ToDouble(unit_price_tb.Text));
    
                if(isAdded)
                {
                    this.DialogResult = DialogResult.Ok;
                }
            }
        }             
    }
    

    然后在Main表单中使用 ShowDialog 方法获取有关成功插入的结果 .

    public class MainForm: Form
    {
        private void ButtonAddItem_Click(object sender, EventArgs e)
        {
            using(var addItemForm = new AddNewItemForm())
            {
                if(addItemForm.ShowDialog() == DialogResult.Ok)
                {
                    // here you can update your DataGridView
                    this.DataGridView.DataSource = df.get_view();
                }
            }
        }           
    }
    

相关问题