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的主要内容,如果未能解决你的问题,请参考以下文章