我想将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();
}
答案 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";
}
}
我想你的问题出在其他地方