将已过滤的datagridview行从Form1添加到Form2中的空datagridview

时间:2014-05-09 03:38:11

标签: c# datagridview filter

private void buttonFilterA_Click(object sender, EventArgs e)
    {

        List<DataGridViewRow> lstRows = new List<DataGridViewRow>();
        foreach (DataGridViewRow dr in dataGridView1.Rows)
        {
            object bloodFiltered = dr.Cells[txtBloodGroup.Index].Value;
            if (bloodFiltered != null && bloodFiltered.ToString() == "A")
            {
                lstRows.Add(dr);                    
            }
        }

        foreach (DataGridViewRow dr in lstRows)
        {
            secondForm.dataGridView2.Rows.Add(dr);                
        }
        secondForm.ShowDialog();                        
    }

大家好,我在编程的这一部分所做的就是过滤血型的类型,我想在datagridview的另一个空Form2中显示它。如果我只删除行,它会很好用,但是当我在datagridview中的Form2内添加行时遇到了问题。它只是没有用。

问题在于:

An unhandled exception of type 'System.InvalidOperationException' occurred in
System.Windows.Forms.dll

No row can be added to a `DataGridView` control that does not have columns. Columns must be added first.

XXXXXSOLVEDXXXXX

private void buttonFilterA_Click(object sender, EventArgs e)
    {
        foreach (DataGridViewColumn dc in dataGridView1.Columns)
        {
            secondForm.dataGridView2.Columns.Add(dc.Name, dc.HeaderText);
        }
        List<DataGridViewRow> lstRows = new List<DataGridViewRow>();
        foreach (DataGridViewRow dr in dataGridView1.Rows)
        {
            object bloodFiltered = dr.Cells[txtBloodGroup.Index].Value;
            if (bloodFiltered != null && bloodFiltered.ToString() == "A")
            {
                lstRows.Add(dr);                    
            }
        }            
        foreach (DataGridViewRow dr in lstRows)
        {
            var newRow = (DataGridViewRow)dr.Clone();
            foreach (DataGridViewCell cell in dr.Cells)
            {
                newRow.Cells[cell.ColumnIndex].Value = cell.Value;
            }
            secondForm.dataGridView2.Rows.Add(newRow);                              
        }
        secondForm.ShowDialog();                        
    }

感谢Grant Winney的大力帮助,现在这段代码能够在Form2中的datagridview上显示已过滤的行,而不会在Form1中的datagridview上中断原始数据(使用Cell Leave事件序列化)。

1 个答案:

答案 0 :(得分:0)

从您的评论中,您似乎已经找到了第一个问题 - 添加列。

您应该能够使用循环复制它们:

foreach (DataGridViewColumn col in dataGridView1.Columns)
    dataGridView2.Columns.Add(col.Name, col.HeaderText);

对于第二个错误,您无法将第一个网格中的DataRow直接添加到第二个错误,但您可以克隆它然后添加它。克隆doesn't copy the cells values,但你也可以在循环中完成。

此代码段将第一行从一个网格克隆到另一个网格:

var newRow = (DataGridViewRow)dataGridView1.Rows[0].Clone();

foreach (DataGridViewCell cell in dataGridView1.Rows[0].Cells)
    newRow.Cells[cell.ColumnIndex].Value = cell.Value;

dataGridView2.Rows.Add(newRow);