C# - 尝试通过 Form2 上的按钮获取 SQL 插入以更新 Form1 上的 dataGridView

Posted

技术标签:

【中文标题】C# - 尝试通过 Form2 上的按钮获取 SQL 插入以更新 Form1 上的 dataGridView【英文标题】:C# - Trying to get SQL Insert via Button on Form2 to update dataGridView on Form1 【发布时间】:2014-06-23 23:47:39 【问题描述】:

我是论坛的新手,这是我的第一篇文章。我已经从阅读其他帖子(不同主题)中学到了一些东西。对于这个主题,我发现了一些接近的,但我的实验并没有成功。这篇文章的标题说明了一切——Form1 上的 dataGridView 填充正常,Form2 上插入新数据库行的按钮工作正常。我需要 Form1 上的 dataGridView 在按下 Form2 上的 Insert 按钮后自动填充...而不重新启动程序。我可以重新启动,新行就在那里。我知道我需要将这两种形式联系在一起......只是不知道如何。我在插入部分得到了一些帮助,但这对于像我这样的初学者来说有点复杂。这是一个小应用程序,我只需要开始工作,所以越简单越好。我将发布一些相当大的代码块(希望不会太大)。任何帮助表示赞赏!

//FORM 1 - PARTIAL CODE
private void Form1_Load(object sender, EventArgs e)

    // TODO: This line of code loads data into the 'DB_TEMPDataSet.Product' table. You can move, or remove it, as needed.
    Fillcombo();
    this.ProductTableAdapter.Fill(this.DB_TEMPDataSet.Product);


private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)

    string strCmd = "Select * from Product where Mode='" + comboBox1.Text + "';";
    SqlConnection con = new SqlConnection(@"Data Source=myserver\dev1;Initial Catalog=DB_TEMP;Integrated Security=True");
    SqlCommand cmd = new SqlCommand(strCmd, con);
    try
    
        con.Open();
        DataTable dt = new DataTable();
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(dt);
        dataGridView1.DataSource = dt;
        con.Close();
     
     catch (Exception ex)
     
        MessageBox.Show(ex.Message);
     


Form2 secondForm = new Form2();

private void button1_Click(object sender, EventArgs e)

    secondForm.ShowDialog();

这是表格 2 的一大块:

//FORM 2 - PARTIAL CODE:

public partial class Form2 : Form

    public Form2()
    
        InitializeComponent();

        Fillcombo2("BranchId", "Product", comboBox1);
        Fillcombo2("Mode", "Product", comboBox2);
        Fillcombo2("ChargeCode", "Product", comboBox3);
        Fillcombo2("ProductCode", "Product", comboBox4);
        Fillcombo2("CustomerType", "Product", comboBox5);
        Fillcombo2("CreatedBy", "Product", comboBox6);
        Fillcombo2("CreatedOn", "Product", comboBox7);
        Fillcombo2("LastUpdatedBy", "Product", comboBox8);
        Fillcombo2("LastUpdatedTime", "Product", comboBox9);
    

    void Fillcombo2(string column, string table, ComboBox box)
    
        string strCmd2 = "Select DISTINCT " + column + " from " + table + ";";
        SqlConnection con2 = new SqlConnection(@"Data Source=myserver\dev1;Initial Catalog=DB_TEMP;Integrated Security=True");
        SqlCommand cmd2 = new SqlCommand(strCmd2, con2);
        SqlDataReader myReader2;

        try
        
            con2.Open();
            myReader2 = cmd2.ExecuteReader();

            while (myReader2.Read())
            
                object sName2 = myReader2[column];
                box.Items.Add(sName2);
            
            con2.Close();
        
        catch (Exception ex)
        
            MessageBox.Show(ex.Message);
        
    

    private void button1_Click(object sender, EventArgs e)
    
        this.DialogResult = DialogResult.OK;

        string strCmd3 = @"
        INSERT INTO dbo.Product (BranchId, Mode, ChargeCode, ProductCode, CustomerType, CreatedBy, CreatedOn, LastUpdatedBy, LastUpdatedTime)
        VALUES(@BranchId, @Mode, @ChargeCode, @ProductCode, @CustomerType, @CreatedBy, @CreatedOn, @LastUpdatedBy, @LastUpdatedTime)
        ";

        using (SqlConnection con3 = new SqlConnection(@"Data Source=myserver\dev1;Initial Catalog=DB_TEMP;Integrated Security=True"))
        
            try
            
                con3.Open();
                using (SqlCommand cmd3 = con3.CreateCommand())
                
                    cmd3.CommandText = strCmd3;
                    AddParameterWithValue(cmd3, "@BranchId", comboBox1.Text);
                    AddParameterWithValue(cmd3, "@Mode", comboBox2.Text);
                    AddParameterWithValue(cmd3, "@ChargeCode", comboBox3.Text);
                    AddParameterWithValue(cmd3, "@ProductCode", comboBox4.Text);
                    AddParameterWithValue(cmd3, "@CustomerType", comboBox5.Text);
                    AddParameterWithValue(cmd3, "@CreatedBy", comboBox6.Text);
                    AddParameterWithValue(cmd3, "@CreatedOn", comboBox7.Text);
                    AddParameterWithValue(cmd3, "@LastUpdatedBy", comboBox8.Text);
                    AddParameterWithValue(cmd3, "@LastUpdatedTime", comboBox9.Text);
                    cmd3.ExecuteNonQuery();
                
                con3.Close();
                MessageBox.Show("Database row INSERT successful!");
            
            catch (Exception ex)
            
                MessageBox.Show(ex.Message);
            
        
    

【问题讨论】:

我建议用这段代码做一些事情……FillCombo2 方法被调用了 9 次……9 次都访问了数据库。这可以而且可能应该合并到一个电话中。此外,变量命名会使代码混乱。 comboBox1、comboBox2、cmd3、con3 应该重命名以使代码更具可读性。 cmbBranchId、cmbMode 等 【参考方案1】:

我将创建一个类来处理所有与Database 相关的操作,这样,它就可以保存DataAdapter 用于插入/更新/删除记录

您可以从 MSDN How to bind Data to DataGridView 和 How to update by using SqlDataAdapter 找到示例。 此外,您可能希望对任何 sql 命令使用 SqlParameter,它可以保护您的应用程序免受 SQL 注入攻击,例如:SqlParameter

【讨论】:

我很欣赏我的代码格式修复,以及 Alex 和 Paul 的设计建议。在进行任何重新设计之前,我最终很容易修复它。我将数据网格的自动填充线添加到 Form1 中的按钮单击事件中。所以:“secondForm.ShowDialog();”改为:DialogResult dialogResult = secondForm.ShowDialog(); if (dialogResult == System.Windows.Forms.DialogResult.OK) this.bUS_Product_Code_XREFTableAdapter.Fill(this.oT01DB_TEMPDataSet.BUS_Product_Code_XREF);

以上是关于C# - 尝试通过 Form2 上的按钮获取 SQL 插入以更新 Form1 上的 dataGridView的主要内容,如果未能解决你的问题,请参考以下文章

请问用C#编写的MDI程序,为啥我从父窗口通过按钮打开子窗口时,父窗口的按钮会在子窗口中显示?

C# form2如何用form1中的数据

C# 委托和事件 实现窗体间的通信

c#单击关闭按钮事件

c# 中form与form之间的数据传递

C#中怎样从一个form的文本框获取另一个form中Comobox控件的值