c#如何获取已检查的datagridview复选框旁边的值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#如何获取已检查的datagridview复选框旁边的值?相关的知识,希望对你有一定的参考价值。

我有一个带CheckBox列的DataGridView,我的问题是如何获取已选中复选框旁边的数据并将它们分配给数组中的变量?

    private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {            
        foreach (DataGridViewRow row in this.dataGridView1.Rows)
        {
            if (Convert.ToBoolean(this.dataGridView1.Rows[e.RowIndex].Cells["chkBoxColumn"].Value = true) == true)
            {
                MessageBox.Show(dataGridView1.Rows[e.RowIndex].Cells[1].Value.ToString());
            }
        }   
    }

它一遍又一遍地打印最后一个检查项目。

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        for (int i = 0; i < dataGridView1.Rows.Count; i++)

        {
            if (bool.Parse(dataGridView1.Rows[i].Cells["chkBoxColumn"].Value.ToString()) == true)
            {
                MessageBox.Show(dataGridView1.Rows[i].Cells[1].Value.ToString());
            }
        }
    } 

我使用这个获得一个空引用异常。

答案

编辑 问题发生了变化,因此调整了代码,以便将值放入列表中。

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{            
    List<string> someList = new List<string>();

    foreach (DataGridViewRow row in this.dataGridView1.Rows)
    {
        var cell = row.Cells[e.ColumnIndex] as DataGridViewCheckBoxCell;

        if (Convert.ToBoolean(cell.Value) == true)
        {
            if (cell.State != DataGridViewElementStates.Selected)
            {
                someList.Add(row.Cells[1].Value.ToString();
            }
        }
        else if (cell.State == DataGridViewElementStates.Selected)
        {
            someList.Add(row.Cells[1].Value.ToString();
        }
    }   
}

这可能会对你有所帮助,但是每次用户勾选一个复选框时你都会弹出一个弹出窗口,你会获得与true复选框一样多的弹出窗口。

另一答案

问题就在于此

MessageBox.Show(dataGridView1.Rows[e.RowIndex].Cells[1].Value.ToString());

e.RowIndex指向改变的行

它应该是:

    for (int i = 0; i <= this.dataGridView1.Rows)
    {
        var row = this.dataGridView1.Rows[i]
        if (Convert.ToBoolean(this.dataGridView1.Rows[i].Cells["chkBoxColumn"].Value = true) == true)
        {
            MessageBox.Show(dataGridView1.Rows[e.RowIndex].Cells[1].Value.ToString());
        }
    }   

另请注意,您的第二个示例中出现错误,因为某些行在复选框列中包含空值。

Convert.ToBoolean(null)返回false

bool.Parse(null)抛出异常

另一答案

我觉得这样的事情?

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{            
    Stringbuilder text = new StringBuilder();
    foreach (DataGridViewRow row in this.dataGridView1.Rows)
    {
        if (Convert.ToBoolean(row.Cells["chkBoxColumn"].Value = true) == true)
        {
            text.Append(row.Cells[1].Value.ToString());                
        }
    }   

    MessageBox.Show(text.ToString());
}

编辑:问题已从显示值更改为将其保存到数组中,因此我还需要更改我的答案

假设您希望将Cell [1]的所有值保存到数组中 并假设该单元格是整数类型。

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{            
    List<int> list = new List<int>();

    foreach (DataGridViewRow row in this.dataGridView1.Rows)
    {
        if (Convert.ToBoolean(row.Cells["chkBoxColumn"].Value = true) == true)
        {
            list.Add(int.Parse(row.Cells[1].Value.ToString()));                
        }
    }   

    // you now have all values saved into the list
}
另一答案

您可以通过单击按钮放置代码并以这种方式查找选中的值:

private void button1_Click(object sender, EventArgs e)
{
    var checkedValues = dataGridView1.Rows.Cast<DataGridViewRow>()
        .Where(row => (bool?)row.Cells["Your CheckBox Column Name"].Value == true)
        .Select(row => string.Format("{0}", row.Cells["The Other Column Name"].Value))
        .ToList();

    MessageBox.Show(string.Join(",", checkedValues));
}

以上是关于c#如何获取已检查的datagridview复选框旁边的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 检查 datagridview 中的多个复选框

勾选复选框时如何在DataGridView中执行计算C#

如何获取dataGridView选中行的列值?

winform中获取datagridview如何获取选中的行,返回值object

如何将数据源绑定到 datagridview 组合框和复选框

如何做:C#写的C/S程序,DataGridView中要添加一列下拉选框,下拉选框的内容由DataTable的一列绑定.