C# 将DataGridViewRow作为引用传递

C# 将DataGridViewRow作为引用传递,c#,for-loop,datagridview,foreach,iteration,C#,For Loop,Datagridview,Foreach,Iteration,我想将DataGridviewRow作为ref传递,在这里我给它的单元格赋值,但我无法这样做 foreach(DataGridViewRow dgr in dgvMarksEntryByClassWise.Rows) { RowValueSet(ref dgr); } 这里给出的是编译时错误,因为dgr是每个迭代变量的foreach 我还尝试使用for loop for (int i = 0; i < dgvMarksEntryByClassWise.Rows.Count; i

我想将
DataGridviewRow
作为
ref
传递,在这里我给它的单元格赋值,但我无法这样做

foreach(DataGridViewRow dgr in dgvMarksEntryByClassWise.Rows)
{
   RowValueSet(ref dgr);
}  
这里给出的是编译时错误,因为dgr是每个迭代变量的
foreach

我还尝试使用
for loop

for (int i = 0; i < dgvMarksEntryByClassWise.Rows.Count; i++)
{
  RowValueSet(ref dgvMarksEntryByClassWise.Rows[i]);
}  
这个怎么样

for (int i = 0; i < dgvMarksEntryByClassWise.Rows.Count; i++)
{
   var myRow = dgvMarksEntryByClassWise.Rows[i];
   RowValueSet(ref myRow);
} 
for(int i=0;i
不能使用“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
List lstDgr=new List();
foreach(dgvMarksEntryByClassWise.Rows中的DataGridViewRow dgr)
{
DataGridViewRow dgrTemp=dgr;
行值集(参考dgrTemp);
lstDgr.Add(dgrTemp);
}  
dgvMarksEntryByClassWise.Rows.Clear();
dgvMarksEntryByClassWise.Rows.AddRange(lstDgr)//无法确定AddRange,请尝试Add方法

希望这有帮助

正如上面的评论所述,您不需要通过引用传递
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();
}

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

我同意关于不使用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";
        }
    }
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
添加(新的DataGridViewTextBoxColumn(){Name=“Column1”});
添加(新的DataGridViewTextBoxColumn(){Name=“Column2”});
添加(新的DataGridViewTextBoxColumn(){Name=“Column3”});
添加(新的DataGridViewTextBoxColumn(){Name=“Column4”});

对于(int i=0;对不起@selman 22我传递了它,但当我将值分配给行的单元格时,它没有将值分配给DataGridViewCells。传递了行,但没有将值分配给datagridview cells。那么问题可能出在RowValueSet方法中?你确定它是正确的吗?我确定RowValueSet没有问题。你能显示代码o吗f
RowValueSet
?@Damith我已经更新了我的代码,没有理由RowValueSet需要ref传递的行。只要传入,你的代码应该可以正常工作。我不理解@daveshaw只需从你的
RowValueSet
方法中删除
ref
,看看它是否有效,我看不出任何通过引用传递的理由。
DataGridViewRow
已经是一个引用类型。顺便说一句,我不会使用“Ref”,而是传递一个DataGridViewRow对象,作为回报,只需拥有:lstDgr.Add(RowValueSet(dgr));
 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";
        }
    }