DataGridView中数据存入数据库方法

  最近在做毕业设计,同时也在学习C#用到DataGridView时开始觉得很难,经过朋友的帮助和自己的努力,稍微的明白了一些,现在就把我写的方法写下来,大家一起学习,写的不好的地方也请指证。

  DataGridView做了新的数据显示控件加入到了.Net 05中,其强大的编辑能力让其成为了数据显示中必不可少的控件。目前对于DataGridView中的更新讲的挺多的,但直接的插入数据好像讲的不是太多,下面就以我的例子说明一下。

  1、首先新建一个项目。

  2、建立一个数据库连接类LinkDataBase。因为数据库操作有很多都是重复性工作,所以我们写一个类来简化对数据库的操作。

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Data;
using  System.Data.SqlClient;
using  System.Data.Sql;

namespace  Test
... {
    
class LinkDataBase
    
...{
        
//设置连接字符串
        private string strSQL;

        
//与数据库连接
        private string connectionString = "Data Source=Localhost;Initial Catalog=Test;Integrated Security=True";

        
private SqlConnection myConnection;
        
private SqlCommandBuilder sqlCmdBld;
        
private DataSet ds = new DataSet();
        
private SqlDataAdapter da;
        
public LinkDataBase()
        
...{
        }


        
//根据输入的SQL语句检索数据库数据
        public DataSet SelectDataBase(string tempStrSQL, string tempTableName)
        
...{
            
this.strSQL = tempStrSQL;
            
this.myConnection = new SqlConnection(connectionString);
            
this.da = new SqlDataAdapter(this.strSQL, this.myConnection);
            
this.ds.Clear();
            
this.da.Fill(ds, tempStrSQL);
            
//返回填充了数据的DataSet,其中数据表以tempTableName给出的字符串命名
            return ds;
        }


        
//数据库数据更新(传DataSet和DataTable的对象)
        public DataSet UpdateDataBase(DataSet changedDataSet, string tableName)
        
...{
            
this.myConnection = new SqlConnection(connectionString);
            
this.da = new SqlDataAdapter(this.strSQL, this.myConnection);
            
this.sqlCmdBld = new SqlCommandBuilder(da);
            
this.da.Update(changedDataSet, tableName);
            
//返回更新过的数据库表
            return changedDataSet;
        }


        
//检索数据库数据(传字符串,直接操作数据库)
        public DataTable SelectDataBase(string tempStrSQL)
        
...{
            
this.myConnection = new SqlConnection(connectionString);
            DataSet tempDataSet 
= new DataSet();
            
this.da = new SqlDataAdapter(tempStrSQL, this.myConnection);
            
this.da.Fill(tempDataSet);
            
return tempDataSet.Tables[0];
        }


        
//数据库数据更新(传字符串,直接操作数据库)
        public int UpdateDataBase(string tempStrSQL)
        
...{
            
this.myConnection = new SqlConnection(connectionString);
            myConnection.Open();
            SqlCommand tempSqlcommand 
= new SqlCommand(tempStrSQL, this.myConnection);
            
int intNumber = tempSqlcommand.ExecuteNonQuery();
            myConnection.Close();
            
return intNumber;
        }

    }

}

  上面这段代码很容易理解。大大的简化了我们的操作。

  2、建立一个DataGridView控件,将其命名。(我这里把他命名成:dgv_type)。再加入一个Combobox控件来实现定位到某格时出现下拉列表框。其实DataGridView具有DataGridViewCombobxColumn属性,但这样做出来的下拉框不如绑定一个Combobox控件美。

   3、下面进行代码绑定

   将数据表Sex中的Sex字段传给Combobox做为Item使用。

public   void  BindType()
... {
    
string tempStrSQL = "select Sex from Sex";
    tempDataTable 
= link.SelectDataBase(tempStrSQL);
            
    
for (int i = 0; i < tempDataTable.Rows.Count; i++)
    
...{
        
//将Sex中性别字段传给Combobox
        this.cmb_sex.Items.Add(tempDataTable.Rows[i][0]);
    }

}

  4、建立DataGridView的CurrentCellChanged事件,产生当焦点进入某单元格内出现Combobox的效果

private   void  dgv_type_CurrentCellChanged( object  sender, EventArgs e)
        
... {
            
if (this.dgv_type.CurrentCell.ColumnIndex == 2)
            
...{
                Rectangle rect 
= dgv_type.GetCellDisplayRectangle(dgv_type.CurrentCell.ColumnIndex, dgv_type.CurrentCell.RowIndex, false);
                
                cmb_sex.Left 
= rect.Left;
                cmb_sex.Top 
= rect.Top;
                cmb_sex.Width 
= rect.Width;
                cmb_sex.Height 
= rect.Width;
                cmb_sex.Visible 
= true;
            }

            
else
            
...{
                cmb_sex.Visible 
= false;
            }

        }

  5、建立Combobox的SelectedIndexChanged事件,当改变时,将值传送给DataGridView相应的单元格内。

  记得啊,比较字符时一定要加上.Trim()去掉空格,当数据库中字段类型为nchar时后面会产生空格造成比较结果不同。例如“男”和“男 ”可是不一样的啊>.<。所以为了良好的习惯最好还是加上.Trim()。

private   void  cmb_sex_SelectedIndexChanged( object  sender, EventArgs e)
        
... {
            
if (((ComboBox)sender).Text.Trim() == "")
            
...{
                
if (dgv_type.CurrentCell != null)
                
...{

                    dgv_type.CurrentCell.Value 
= "";
                    dgv_type.CurrentCell.Tag 
= "1";
                }

            }

            
if (((ComboBox)sender).Text.Trim() == "")
            
...{
                
if (dgv_type.CurrentCell != null)
                
...{

                    dgv_type.CurrentCell.Value 
= "";
                    dgv_type.CurrentCell.Tag 
= "2";
                }

            }

        }

  6、建立DataGridView的DataBindingComplete事件,用来显示单元格内的值

private   void  dgv_type_DataBindingComplete( object  sender, DataGridViewBindingCompleteEventArgs e)
        
... {
            
for (int i = 0; i < this.dgv_type.Rows.Count; i++)
            
...{
                
if (dgv_type.Rows[i].Cells[1].Value != null && dgv_type.Rows[i].Cells[1].ColumnIndex == 1)
                
...{
                    dgv_type.Rows[i].Cells[
1].Tag = dgv_type.Rows[i].Cells[1].Value.ToString();
                    
if (dgv_type.Rows[i].Cells[1].Value.ToString() == "1")
                    
...{
                        dgv_type.Rows[i].Cells[
1].Value = "";
                    }

                    
else if (dgv_type.Rows[i].Cells[1].Value.ToString() == "2")
                    
...{
                        dgv_type.Rows[i].Cells[
1].Value = "";
                    }

                }

            }

        }

  7、最后把所有的事件放到Load中

private   void  Form1_Load( object  sender, EventArgs e)
        
... {
            BindType();
            cmb_sex.SelectedIndexChanged 
+= new EventHandler(cmb_sex_SelectedIndexChanged);

            
this.dgv_type.Controls.Add(cmb_sex);
        }

  现在可以在表中输入数据了。输入数据后呢,当然我们要把他们保存到数据库内。

  8、建立一个Button控件来实现数据的保存。其中使用了一个rowMax来记录DataGridView中输入数据的最大行号。因为在保存后有时还要继续向表内输入数据,这样做可以记录下先前保存时的最大行号,避免重复输入数据的错误。(好像Adapter.updata()可以更新,但我不会。。。。。。这里也希望请教一下)

 

private   void  btn_save_Click( object  sender, EventArgs e)
        
... {
            
string tempStrSQL;
            
            
//rowMax为当前DataGridView中最大行号
            for (int i = rowMax; rowMax < this.dgv_type.Rows.Count; rowMax++)
            
...{
                
if (this.dgv_type.Rows[rowMax].Cells[0].Value == null)
                
...{
                    
break;
                }

                
else
                
...{
                    
string ID = dgv_type.Rows[rowMax].Cells[0].Value.ToString().Trim();
                    
string Name = dgv_type.Rows[rowMax].Cells[1].Value.ToString().Trim();
                    
string Sex = dgv_type.Rows[rowMax].Cells[2].Value.ToString().Trim();

                    
string sendValues = "('" + ID + "','" + Name + "','" + Sex + "')";
                    tempStrSQL 
= "insert Name (ID,Name,Sex) values " + sendValues;
                    link.UpdateDataBase(tempStrSQL);
                }

            }

            MessageBox.Show(
"保存成功""信息");
        }

 

  至此,基本就完成了,下面给出所有代码。

 

using  System;
using  System.Collections.Generic;
using  System.ComponentModel;
using  System.Data;
using  System.Drawing;
using  System.Text;
using  System.Windows.Forms;
using  System.Data.SqlClient;

namespace  Test
... {
    
public partial class Form1 : Form
    
...{
        
private DataSet ds = new DataSet();
        
private SqlDataAdapter da = new SqlDataAdapter();
        
private DataTable tempDataTable;
        
private LinkDataBase link = new LinkDataBase();

        
//用来存放DataGridView中输入数据的最大行号
        private int rowMax = 0;

        
public Form1()
        
...{
            InitializeComponent();
        }


        
private void Form1_Load(object sender, EventArgs e)
        
...{
            BindType();
            cmb_sex.SelectedIndexChanged 
+= new EventHandler(cmb_sex_SelectedIndexChanged);

            
this.dgv_type.Controls.Add(cmb_sex);

        }


        
public void BindType()
        
...{
            
string tempStrSQL = "select Sex from Sex";
            tempDataTable 
= link.SelectDataBase(tempStrSQL);
            
            
for (int i = 0; i < tempDataTable.Rows.Count; i++)
            
...{
                
//将Sex中性别字段传给Combobox
                this.cmb_sex.Items.Add(tempDataTable.Rows[i][0]);
            }

        }


        
private void dgv_type_CurrentCellChanged(object sender, EventArgs e)
        
...{
            
if (this.dgv_type.CurrentCell.ColumnIndex == 2)
            
...{
                Rectangle rect 
= dgv_type.GetCellDisplayRectangle(dgv_type.CurrentCell.ColumnIndex, dgv_type.CurrentCell.RowIndex, false);
                
                cmb_sex.Left 
= rect.Left;
                cmb_sex.Top 
= rect.Top;
                cmb_sex.Width 
= rect.Width;
                cmb_sex.Height 
= rect.Width;
                cmb_sex.Visible 
= true;
            }

            
else
            
...{
                cmb_sex.Visible 
= false;
            }

        }

        
        
private void cmb_sex_SelectedIndexChanged(object sender, EventArgs e)
        
...{
            
if (((ComboBox)sender).Text.Trim() == "")
            
...{
                
if (dgv_type.CurrentCell != null)
                
...{

                    dgv_type.CurrentCell.Value 
= "";
                    dgv_type.CurrentCell.Tag 
= "1";
                }

            }

            
if (((ComboBox)sender).Text.Trim() == "")
            
...{
                
if (dgv_type.CurrentCell != null)
                
...{

                    dgv_type.CurrentCell.Value 
= "";
                    dgv_type.CurrentCell.Tag 
= "2";
                }

            }

        }


        
private void dgv_type_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        
...{
            
for (int i = 0; i < this.dgv_type.Rows.Count; i++)
            
...{
                
if (dgv_type.Rows[i].Cells[1].Value != null && dgv_type.Rows[i].Cells[1].ColumnIndex == 1)
                
...{
                    dgv_type.Rows[i].Cells[
1].Tag = dgv_type.Rows[i].Cells[1].Value.ToString();
                    
if (dgv_type.Rows[i].Cells[1].Value.ToString() == "1")
                    
...{
                        dgv_type.Rows[i].Cells[
1].Value = "";
                    }

                    
else if (dgv_type.Rows[i].Cells[1].Value.ToString() == "2")
                    
...{
                        dgv_type.Rows[i].Cells[
1].Value = "";
                    }

                }

            }

        }


        
private void btn_save_Click(object sender, EventArgs e)
        
...{
            
string tempStrSQL;
            
            
//rowMax为当前DataGridView中最大行号
            for (int i = rowMax; rowMax < this.dgv_type.Rows.Count; rowMax++)
            
...{
                
if (this.dgv_type.Rows[rowMax].Cells[0].Value == null)
                
...{
                    
break;
                }

                
else
                
...{
                    
string ID = dgv_type.Rows[rowMax].Cells[0].Value.ToString().Trim();
                    
string Name = dgv_type.Rows[rowMax].Cells[1].Value.ToString().Trim();
                    
string Sex = dgv_type.Rows[rowMax].Cells[2].Value.ToString().Trim();

                    
string sendValues = "('" + ID + "','" + Name + "','" + Sex + "')";
                    tempStrSQL 
= "insert Name (ID,Name,Sex) values " + sendValues;
                    link.UpdateDataBase(tempStrSQL);
                }

            }

            MessageBox.Show(
"保存成功""信息");
        }

    }

}

 

   最后的效果

   第一次写这种东西,写的方法很笨,只是用做交流,同时也希望得到指教。大家共同努力!

你可能感兴趣的:(.net,数据库,dataset,null,button,.net,工作)