【问题标题】:Delete the single selected row from a grid view at run time在运行时从网格视图中删除单个选定的行
【发布时间】:2015-01-02 05:48:20
【问题描述】:

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

  NAME    KEY
PRITAM    123
SOURAV    263

在此数据网格视图中,用户可以通过选择并单击下面的删除按钮来删除蚂蚁行。通过单击末尾的添加新行按钮插入任何行,修改任何现有数据,最后单击更新按钮,所有数据都将像以前的格式一样存储在该数据库中..为此我写了像这样在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; }
            }

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

【问题讨论】:

  • 老兄,不要大写锁定。
  • 为什么你对你的接近不满意?

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


【解决方案1】:

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

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

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

当然,列必须是可编辑的

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

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

然后在comboBox1_SelectedIndexChanged事件处理程序中使用LoadScheduleDetails

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

加载数据后,用户可以对其进行更改、添加行、删除行
当用户按下“更新”按钮然后使用SaveDetails 方法,
我们从所有行收集数据并用它更新数据库

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

【讨论】:

  • 这是正确的答案。+1 用于使用键值对,这就是问题所在。
【解决方案2】:

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

编辑:-

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事件插入编辑删除

【讨论】:

  • 我假设您的答案是针对 ASP.NET。关于Winforms的问题
  • @Fabio:请查看答案并在必要时改进答案
  • 抱歉,您现在回答有点困惑。问题已经包含相同的方法(选择组合框值后将数据加载到 datagridview)。而DataGridView 没有像RowCommand 这样的事件
  • 再次抱歉,但这不是问题的答案。并且CellClick 事件不能用于添加、删除行。检查我的答案-如果您不同意,请随时发表评论/投票:)
猜你喜欢
  • 2014-12-17
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
相关资源
最近更新 更多