传递DataGridViewRow作为参考

时间:2014-01-21 05:39:41

标签: c# for-loop datagridview foreach iteration

我想将DataGridviewRow作为ref传递给我为其单元格分配一些值,但我无法执行此操作

foreach(DataGridViewRow dgr in dgvMarksEntryByClassWise.Rows)
{
   RowValueSet(ref dgr);
}  

这里给出了编译时错误,因为dgr是foreach iteration variable
我也尝试用for loop

来做
for (int i = 0; i < dgvMarksEntryByClassWise.Rows.Count; i++)
{
  RowValueSet(ref dgvMarksEntryByClassWise.Rows[i]);
}  

但是这里也给出了编译时间错误:
 A property,indexer or dynamic member acces cannot passed as an out reference

我在上述错误中提到了这个问题,但没有找到我的问题的任何适当的解决方案

请建议我如何做到这一点

更新代码

void RowValueSet(ref DataGridViewRow dgr)
{
dgr.Cells["StudentZero"].Value = ss.Where(w => w.MarksheetMarks == "0").Count();
if (ss.Count() != 0)
dgr.Cells["StudentISEmpty"].Value = Convert.ToInt16(lblTotlatStudent1.Text) - ss.Count();
else
dgr.Cells["StudentISEmpty"].Value = 0;
dgr.Cells["StudentEntry"].Value = ss.Count();
}

4 个答案:

答案 0 :(得分:2)

您无法使用“foreach”甚至“for”分配迭代的枚举项。 我使用那段代码解决了一次:

List<DataGridViewRow> lstDgr = new List<DataGridViewRow>();
foreach(DataGridViewRow dgr in dgvMarksEntryByClassWise.Rows)
{
   DataGridViewRow dgrTemp = dgr;
   RowValueSet(ref dgrTemp);
   lstDgr.Add(dgrTemp);
}  
dgvMarksEntryByClassWise.Rows.Clear();
dgvMarksEntryByClassWise.Rows.AddRange(lstDgr); //Not sure about the AddRange, try the Add method instead

希望这有帮助

答案 1 :(得分:2)

如上述评论所述,您无需通过引用传递DataGridViewRow。从参数中删除ref

void RowValueSet(DataGridViewRow dgr)
{
    dgr.Cells["StudentZero"].Value = ss.Where(w => w.MarksheetMarks == "0").Count();
    if (ss.Count() != 0)
        dgr.Cells["StudentISEmpty"].Value = Convert.ToInt16(lblTotlatStudent1.Text) - ss.Count();
    else
        dgr.Cells["StudentISEmpty"].Value = 0;
    dgr.Cells["StudentEntry"].Value = ss.Count();
}

如果网格中的值似乎没有更新,则出于另一个原因。当您需要刷新显示时,是否重新绑定网格?

答案 2 :(得分:1)

这个怎么样?

for (int i = 0; i < dgvMarksEntryByClassWise.Rows.Count; i++)
{
   var myRow = dgvMarksEntryByClassWise.Rows[i];
   RowValueSet(ref myRow);
} 

答案 3 :(得分:0)

我同意关于不使用ref传递行的注释。它是一种参考类型。您通常只将该关键字与值类型(例如int等)一起使用。

我在更改单元格值后DataGridView没有更新时遇到问题,并且经常需要调用dataGridView1.Invalidate();这取决于事情是如何联系起来的。如果你将数据绑定与继承自INotifyPropertyChanged的类一起使用,那么它似乎总能工作,但是如果你只是改变单元格值,我注意到它不会更新的奇怪时间。

这是一个有效的例子。创建一个新的应用程序,将一个空的DataGridView添加到窗体上,并用以下代码替换代码。这证明您不需要使用ref。

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() { Name = "Column1" });
            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() { Name = "Column2" });
            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() { Name = "Column3" });
            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() { Name = "Column4" });

            for (int i = 0; i <= 4; i++)
            {
                dataGridView1.Rows.Add();
            }

            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                RowValueSet(row);
            }
        }

        private void RowValueSet(DataGridViewRow row)
        {
            row.Cells["Column1"].Value = "1";
            row.Cells["Column2"].Value = "2";
            row.Cells["Column3"].Value = "3";
            row.Cells["Column4"].Value = "4";
        }
    }

我想你的问题出在其他地方