在运行时从网格视图中删除单个选定的行

时间:2015-01-02 05:48:21

标签: c# windows winforms c#-4.0 datagridview

我有一个包含2列的表格IDDETAILS。表中的数据就像 id=01 details="pritam=123 sourav=263“就像这样  我正在开发一个应用程序窗口..当应用程序将运行输出时,我将告诉... 1.在我的应用程序中有一个组合框就在那里。当应用程序将运行所有id将是绑定在表格的组合框中。 2.当用户突然选择任何id时,详细信息列数据将以分割格式显示在数据网格视图中。

  NAME    KEY
PRITAM    123
SOURAV    263

在此数据网格视图中,用户可以通过选择并单击下面的删除按钮来删除ant行。通过点击最后添加新行按钮插入任何行,修改任何现有数据,最后点击更新按钮,所有数据将像以前的格式一样存储在该数据库中...因为我写了c#中的代码就像这样..

namespace windows_csharpp
    {
        public partial class Form5 : Form
        {
            SqlConnection cc = new SqlConnection("Integrated Security=true;database=EDIXfer");
        SqlDataAdapter da;
        DataTable dt;
        public Form5()
        {
            InitializeComponent();
        }

        private void Form5_Load(object sender, EventArgs e)
        {
             string sql="select EDIScheduleID from ETAProcessSchedule";
             da= new SqlDataAdapter(sql, cc);
            dt = new System.Data.DataTable();
            da.Fill(dt);
            for (int x = 0; x < dt.Rows.Count; x++)
            {
                comboBox1.Items.Add(dt.Rows[x][0].ToString());
            }
        }

       ArrayList ls = new ArrayList();
        int ss = 0;
        int ss1 = 0;
        int ssp = 1;

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

            string sql = "select * from ETAProcessSchedule where EDIScheduleID='" + comboBox1.SelectedItem.ToString() + "'";
            SqlDataAdapter adp = new SqlDataAdapter(sql, cc);
            DataTable dt = new System.Data.DataTable();

            adp.Fill(dt);
            string stp = dt.Rows[0][21].ToString();
            string[] stp1 = stp.Split(' ');
            List<Class1> lst = new List<Class1>();
            ls.Clear();
            for (int x = 0; x < stp1.Length; x++)
            {
                ls.Add(stp1[x].ToString());
            }
            for (int x = 0; x < ls.Count; x++)
            {
                string ssttt = ls[x].ToString();
                string[] sssp = ssttt.Split('=');


                for (int x1 = 1; x1 < sssp.Length; x1++)
                {
                    ss = 0;
                    ss1 = ssp;

                    Class1  cs = new Class1() 
                    { 
                        Value = sssp[ss], Key= sssp[x1].ToString()
                    };


                        lst.Add(cs);

                }

            }


            dataGridView1.DataSource = lst;

        }

        private void Update_Click(object sender, EventArgs e)
        {
            string value = null;
            string keys = null;
            string query = null;
            string str = null;

            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
                value = dataGridView1.Rows[i].Cells[0].Value.ToString();
                keys = dataGridView1.Rows[i].Cells[1].Value.ToString();

                string ss =  value + '=' + keys;
                str += ss + ' '; 
            }
            query = "update ETAProcessSchedule set ProcParameters='"+str+"' where EDIScheduleID='"+comboBox1.SelectedItem.ToString()+"'";
            da = new SqlDataAdapter(query, cc);
            dt = new DataTable();
            da.Fill(dt);
            MessageBox.Show("Data Updated In Database Successfully");

        }

还有一个类文件..

  class Class1
            {
            public string Value { get; set; }
            public string Key { get; set; }
            }

请帮我删除所选行,添加新行并更新数据库中的所有数据,就像以前的格式一样。

2 个答案:

答案 0 :(得分:1)

我认为你已经有了工作方法。如果我理解正确,你只需要两个功能:
  - 在Schedule(每行一个键值对)中加载DataGridView详细信息   - 将已编辑/添加/删除的键值对保存到数据库

确保DataGridView的下一个属性设置为true:

this.YourDataGridView.AllowUserToAddRows = true;
this.YourDataGridView.AllowUserToDeleteRows = true;

当然列必须是可编辑的

在方法中使用了在表单(Form1)中创建的const变量

private const string DETAILSDELIMITER = ' ';
private const string NAMEKEYDELIMITER = '=';

DataGridView

中加载计划明细的方法
    //Use SqlParameters in the query,
    //if not your application vulnerable for sql injection
    private void LoadScheduleDetails(string scheduleID)
    {
        //You working only with one column, do not use '*' in SELECT statement if not nessesary
        string query = "SELECT EDIScheduleID, ProcParameters FROM ETAProcessSchedule WHERE EDIScheduleID = @ScheduleID";
        DataTable details = new DataTable();
        //Get data from database
        using (SqlConnection yourConnection = new SqlConnection(_YourConnectionString))
        {
            using(SqlCommand detailsCommand = new SqlCommand(query, yourConnection))
            {
                //Adding parameter
                SqlParameter id = new SqlParameter { ParameterName = "@ScheduleID",  SqlDbType = SqlDbType.NVarChar,  Value = scheduleID };
                detailsCommand.Parameters.Add(id);
                using (SqlDataAdapter yourAdapter = new SqlDataAdapter(detailsCommand ))
                {
                    yourAdapter.Fill(details);
                }
            }
        }
        this.YourDataGridView.Rows.Clear();
        if (details.Rows.Count > 0)
        {
            DataRow temp = details.Rows[0];
            //get column by name. 
            string[] pairs = temp.Field<String>("ProcParameters").Split(Form1.DETAILSDELIMITER);
            //Adding rows manually without DataSource
            foreach(string pair in pairs)
            {
                this.YourDataGridView.Rows.Add(pair.Split(Form1.NAMEKEYDELIMITER));
            }
        }
    }

保存数据的方法
如果您在设计器中创建了列,我认为会更好 然后,您可以按名称访问列,而无需使用硬编码索引

    private void SaveDetails(string scheduleID)
    {
        StringBuilder details = new StringBuilder();
        foreach(DataGridViewRow dgvr in this.YourDataGridView.Rows)
        {
            string name = dgvr.Cells[this.dgvColumn_Name.Name].Value.ToString();
            string key = dgvr.Cells[this.dgvColumn_Key.Name].Value.ToString();
            //Here you can check if values are ok(not empty or something else)
            //Create pair
            details.Append(Form1.DETAILSDELIMITER);
            details.Append(name);
            details.Append(Form1.NAMEKEYDELIMITER);
            details.Append(key);
        }
        //remove first space character
        if (details.Length > 0)
            details.Remove(0, 1);
        //Save data to database
        string query = "UPDATE ETAProcessSchedule SET ProcParameters=@Details WHERE EDIScheduleID=@ScheduleID";
        using (SqlConnection yourConnection = new SqlConnection(_YourConnectionString))
        {
            using (SqlCommand saveCommand = new SqlCommand(query, yourConnection))
            {
                //Adding parameters
                SqlParameter id = new SqlParameter { ParameterName = "@ScheduleID", SqlDbType = SqlDbType.NVarChar, Value = scheduleID };
                SqlParameter procParams = new SqlParameter { ParameterName = "@Details", SqlDbType = SqlDbType.NVarChar, Value = details.ToString() };
                saveCommand.Parameters.Add(id);
                saveCommand.Parameters.Add(procParams);
                saveCommand.ExecuteNonQuery();
                MessageBox.Show("Data Updated In Database Successfully");
            }
        }
    }

然后在LoadScheduleDetails eventhandler

中使用comboBox1_SelectedIndexChanged
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    string scheduleID = comboBox1.SelectedItem.ToString();
    if(String.IsNullOrEmpty(scheduleID) == false)
    {
        this.LoadScheduleDetails(scheduleID);
    }
}

加载数据后,用户可以更改,添加行,删除行 当用户按下&#34;更新&#34;按钮然后使用SaveDetails方法,
我们从所有行收集数据并用它更新数据库

private void Update_Click(object sender, EventArgs e)
{
    string scheduleID = comboBox1.SelectedItem.ToString();
    if(String.IsNullOrEmpty(scheduleID) == false)
    {
        this.SaveDetails(scheduleID);
    }
}

答案 1 :(得分:0)

在表单上加载绑定数据: -

编辑: -

private void Form5_Load(object sender, EventArgs e)
    {
                   comboBox1.DataSource = loadddltable();
                    comboBox1.DisplayMember  = "Name";
                    comboBox1.ValueMember  = "ID";
    }

public DataTable loadddl()
        {
            OleDbDataReader obj = null;
            DataTable dt = new DataTable();
            try
            {
                obj_dbconnection.CommandText = "Select * from TableName";
                obj = obj_dbconnection.ExecuteReader();
                if (obj != null)
                {
                    if (obj.HasRows)
                    {
                        dt.Load(obj);
                    }
                }

            }
            catch (Exception)
            {

            }

            finally
            {
                if (obj != null)
                {
                    obj.Close();
                    obj_dbconnection.Close();
                }
            }
            return dt;
        }

/*Code for Execute Reader*/
  public OleDbDataReader ExecuteReader()
        {
            OleDbDataReader dr = null;
            try
            {
                Open();
                dr = cmd.ExecuteReader();
            }
            catch(Exception)
            { }
            return dr;
        }

/*Code for binding grid data*/

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
             dataGridView1.DataSource= getDataForSelectedId(comboBox1.SelectedValue);
        }

然后插入,编辑,删除按钮作为模板字段到dataGridView并使用dataGridView1_CellClick事件插入编辑删除