简体   繁体   中英

Delete the single selected row from a grid view at run time

I have a table having 2 columns viz ID and DETAILS .Data in a table is like id=01 details="pritam=123 sourav=263 " like this i am working on a windows for application ..when the application will run the output comes what i am going to tell.. 1.in my application one combobox is there.when the application will run all the id will be bind in a combobox from the table. 2.when user will choose any id suddenly the details column data will be shown in a datagrid view in a splitted format like this.

  NAME    KEY
PRITAM    123
SOURAV    263

in this data grid view user can delete ant row by selecting the and click on the below delete button. insert any row by clickng the add new row button at the end ,modify any existing data and finally click on the update button and all the data are going to be stored in that data base like in previous format.. for that i have written the code in c# like this..

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");

        }

and one class file is also there ..

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

kindly help me in delete the selected row ,add the new row and update the all data in database like in previous format..

I think you already have working approach. If I understand right you need only two functions:
- Load Schedule details in the DataGridView (one key-value pair per row)
- Save edited/added/deleted key-value pairs to the database

Be sure next properties of DataGridView set to true:

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

And of course columns must be editable

In the methods was used const variables which was created in your Form (Form1)

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

Method for loading schedule details in the 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));
            }
        }
    }

Method for saving data
I think better if you create columns already in the designer
Then you can access columns by it's name without hardcoding indexes

    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");
            }
        }
    }

Then use LoadScheduleDetails in the comboBox1_SelectedIndexChanged eventhandler

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

After data loaded, user can change it, add rows, delete rows
When user pressed "Update" button then use SaveDetails method,
where we collect data from all rows and update database with it

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

On your form load bind data:-

EDIT : -

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);
        }

And then insert,edit,delete buttons as template fields to dataGridView and use dataGridView1_CellClick event to insert edit delete

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM