DataGridView中如何动态添加列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DataGridView中如何动态添加列相关的知识,希望对你有一定的参考价值。

不是利用数据源,而是用编程来指定列头,用中文来替换列头
添加完列头后,接着配置数据源,然后显示的列就是动态添加的列

已经自己解决了.
使用this.DataGridView1.Columns[字段名].HeaderText = "要起的名字",一定是要给DataGireView加完数据源做

参考技术A DataTable dt = new DataTable();

dt.Columns.Add("id");
dt.Columns.Add("name");

DataRow dr = dt.NewRow();
参考技术B 正需要这个,多谢,

DataGridView 复选框列 - 值和功能

【中文标题】DataGridView 复选框列 - 值和功能【英文标题】:DataGridView checkbox column - value and functionality 【发布时间】:2010-11-17 07:02:16 【问题描述】:

我在我的 C# 表单中的 DataGridView 中添加了一个复选框列。该功能需要是动态的 - 您选择一个客户,并显示他们所有可以服务的项目,然后您选择这次您希望为哪些项目提供服务。

无论如何,代码现在将在 DGV 的开头添加一个 chckbox。我需要知道的是:

1) 如何使整列默认“选中”? 2) 当我点击 DGV 正下方的按钮时,如何确保仅从“选中”行中获取值?

这是插入列的代码:

DataGridViewCheckBoxColumn doWork = new DataGridViewCheckBoxColumn();
            doWork.HeaderText = "Include Dog";
            doWork.FalseValue = "0";
            doWork.TrueValue = "1";
            dataGridView1.Columns.Insert(0, doWork);

那么接下来呢? 任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

    没有办法直接做到这一点。将数据放入网格后,您可以遍历行并选中每个框,如下所示:

    foreach (DataGridViewRow row in dataGridView1.Rows)
    
        row.Cells[CheckBoxColumn1.Name].Value = true;
    
    

    Click 事件可能如下所示:

    private void button1_Click(object sender, EventArgs e)
    
        List<DataGridViewRow> rows_with_checked_column = new List<DataGridViewRow>();
        foreach (DataGridViewRow row in dataGridView1.Rows)
        
            if (Convert.ToBoolean(row.Cells[CheckBoxColumn1.Name].Value) == true)
            
                rows_with_checked_column.Add(row);
            
        
        // Do what you want with the check rows
    
    

【讨论】:

非常感谢!这真的很有用,但只有一件事......当我到达那一点时,要从选中的行中获取信息,我将如何从特定的单元格中获取信息(例如,所有选中的单元格的第 2 列中的单元格值)另外......你似乎真的很了解你的 C# 知识,有什么书可以推荐吗?谢谢。 其实,没关系,我已经找到了一种方法。再次感谢您的帮助! 很高兴你发现了它。至于推荐一本书,我不能说我知道任何学习C#的书。我确实经常使用 msdn (msdn.microsoft.com/en-us/library/ms229335.aspx) 网站来查找方法/属性/描述/示例/等,所以我想说那可能是最好的参考,哦,也是这样;) 如果连续单击复选框 2,3 次,则会出现异常无法将 Checked 转换为布尔值。最初它显示值为 true,然后将其更改为选中。 == true 中的 if 是什么意思?【参考方案2】:
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)

    DataGridViewCheckBoxCell ch1 = new DataGridViewCheckBoxCell();
    ch1 = (DataGridViewCheckBoxCell)dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[0];

    if (ch1.Value == null)
        ch1.Value=false;
    switch (ch1.Value.ToString())
    
        case "True":
            ch1.Value = false;
            break;
        case "False":
            ch1.Value = true;
            break;
    
    MessageBox.Show(ch1.Value.ToString());

查找datagridview中的复选框是否被选中的最佳解决方案。

【讨论】:

谢谢,效果很好!仅在单元格有复选框时处理事件:// .... DataGridView dgv = (DataGridView)sender; if (dgv.CurrentCell.GetType() != typeof(DataGridViewCheckBoxCell)) return; // ... 感谢您的精彩回答! 感谢 @Nazeer 只是对您的代码稍作调整 sn-p if (ch1.Value == null) ch1.Value = false; ch1.Value = !(bool)ch1.Value; 而不是 switch (ch1.Value.ToString()) case "True": ch1.Value = false; break; case "False": ch1.Value = true; break; 精简版 if (ch1.Value == null) ch1.Value = false; ch1.Value = !(bool)ch1.Value;【参考方案3】:

我花了很长时间才弄清楚如何做到这一点,而不必遍历所有记录。我有一个绑定的datagridview-source,除复选框列外,所有字段都已绑定。所以我没有/不需要一个循环来添加每一行,我不想仅仅为了这个目的而创建一个。所以经过多次尝试,我终于得到了它。而且其实也很简单:

首先,您使用自定义复选框单元格向您的项目添加一个新的 .cs 文件,例如

DataGridViewCheckboxCellFilter.cs:

using System.Windows.Forms;

namespace MyNamespace 
    public class DataGridViewCheckboxCellFilter : DataGridViewCheckBoxCell 
        public DataGridViewCheckboxCellFilter() : base() 
            this.FalseValue = 0;
            this.TrueValue = 1;
            this.Value = TrueValue;
        
    

在此之后,在您的 GridView 上添加复选框列,您可以:

// add checkboxes
DataGridViewCheckBoxColumn col_chkbox = new DataGridViewCheckBoxColumn();

    col_chkbox.HeaderText = "X";
    col_chkbox.Name = "checked";
    col_chkbox.CellTemplate = new DataGridViewCheckboxCellFilter();                

this.Columns.Add(col_chkbox);

就是这样!每次将复选框添加到新行时,它们都会设置为 true。 享受吧!

【讨论】:

我最喜欢这个实现。似乎是最快的性能明智。你不必做任何循环。 这是问题的答案。谢谢。【参考方案4】:

这是这个问题的唯一答案

List<DataGridViewRow> list = DataGridView1.Rows.Cast<DataGridViewRow>().Where(k => Convert.ToBoolean(k.Cells[CheckBoxColumn1.Name].Value) == true).ToList();

【讨论】:

+1 正是我要找的 Rob,谢谢。注意:我得到了一个 Object not set DBNUll 异常,所以我将您的代码更改为:'//找到选定的行 - 在 Lamba 的一行中 - 没有延迟执行! List selectedSeriesCodes = gridSeriesList.Rows.Cast().Where(g => !string.IsNullOrEmpty(g.Cells["Selected"].Value.ToString()) && Convert.ToBoolean(g.Cells [“选定”].Value) == true).ToList();'【参考方案5】:

如果你在CellContentClick Event 上尝试一下

用途:

dataGridView1.EndEdit();  //Stop editing of cell.
MessageBox.Show("0 = " + dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString());

【讨论】:

【参考方案6】:

如果您有一个包含多个复选框的 gridview .... 你应该试试这个....

Object[] o=new Object[6];

for (int i = 0; i < dgverlist.RowCount; i++)

    for (int j = 2; j < dgverlist.ColumnCount; j++)
    
        DataGridViewCheckBoxCell ch1 = new DataGridViewCheckBoxCell();
        ch1 = (DataGridViewCheckBoxCell)dgverlist.Rows[i].Cells[j];

        if (ch1.Value != null)
        
           o[i] = ch1.OwningColumn.HeaderText.ToString();

            MessageBox.Show(o[i].ToString());
        
    

【讨论】:

【参考方案7】:

1) 如何使整列默认“选中”?

var doWork = new DataGridViewCheckBoxColumn();
doWork.Name = "IncludeDog" //Added so you can find the column in a row
doWork.HeaderText = "Include Dog";
doWork.FalseValue = "0";
doWork.TrueValue = "1";

//Make the default checked
doWork.CellTemplate.Value = true;
doWork.CellTemplate.Style.NullValue = true;

dataGridView1.Columns.Insert(0, doWork);

2) 如何确保只从“已检查”行中获取值?

foreach (DataGridViewRow row in dataGridView1.Rows)

    if (row.IsNewRow) continue;//If editing is enabled, skip the new row

    //The Cell's Value gets it wrong with the true default, it will return         
    //false until the cell changes so use FormattedValue instead.
    if (Convert.ToBoolean(row.Cells["IncludeDog"].FormattedValue))
    
        //Do stuff with row
    

【讨论】:

【参考方案8】:

测试列是否被选中:

for (int i = 0; i < dgvName.Rows.Count; i++)

    if ((bool)dgvName.Rows[i].Cells[8].Value)
    
    // Column is checked
    

【讨论】:

【参考方案9】:

如果您在 sql 数据库(位)中将此列作为数据类型,您应该编辑此代码

DataGridViewCheckBoxColumn doWork = new DataGridViewCheckBoxColumn();
doWork.HeaderText = "Include Dog";
doWork.FalseValue = "0";
doWork.TrueValue = "1";
dataGridView1.Columns.Insert(0, doWork);

有了这个

DataGridViewCheckBoxColumn doWork = new DataGridViewCheckBoxColumn();
doWork.HeaderText = "Include Dog";
doWork.FalseValue = "False";
doWork.TrueValue = "True";
dataGridView1.Columns.Insert(0, doWork);

【讨论】:

【参考方案10】:

其实很简单

DataGridViewCheckBoxCell checkedCell = (DataGridViewCheckBoxCell) grdData.Rows[e.RowIndex].Cells["grdChkEnable"];
    
bool isEnabled = false;
if (checkedCell.AccessibilityObject.State.HasFlag(AccessibleStates.Checked))

    isEnabled = true;

if (isEnabled)

   // do your business process;

【讨论】:

【参考方案11】:

如果由于绑定了 BIT 类型的记录集而已经创建了您的列,那么该列的类型无论如何都是文本。我找到的解决方案是删除该列并将其替换为具有相同绑定数据的DataGridViewCheckBoxColumn

DataGridViewColumn oldCol = dgViewCategory.Columns["mycolumn"];
int chkIdx = oldCol.Index;
DataGridViewCheckBoxColumn chkCol = new DataGridViewCheckBoxColumn();
chkCol.HeaderText = oldCol.HeaderText;
chkCol.FalseValue = "False";
chkCol.TrueValue = "True";
chkCol.DataPropertyName = oldCol.DataPropertyName;
chkCol.Name = oldCol.Name;
dgViewCategory.Columns.RemoveAt(chkIdx);
dgViewCategory.Columns.Insert(chkIdx, chkCol);

【讨论】:

以上是关于DataGridView中如何动态添加列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 jQuery DataTables 中添加静态列

求用c#在dataGridView中动态添加列的方法

gridview如何动态添加列,如何在添加列后显示数据

如何在gridview里添加一列详细信息

在windows form应用程式里添加了一个DataGridView,DataGridView的大小固定,里面的表头和内容动态添加

求教easyui datagrid如何动态生成列