【问题标题】:Passing DataGridViewRow as referance传递 DataGridView Row 作为参考
【发布时间】:2014-02-10 13:37:13
【问题描述】:

我想将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();
}

【问题讨论】:

  • 你能显示RowValueSet的代码吗?
  • @Damith 我更新了我的 codd
  • 没有理由 RowValueSet 需要 ref 传递的行。只需传入它,您的代码应该可以正常工作。
  • 我听不懂@DaveShaw
  • 只需从您的 RowValueSet 方法中删除 ref 并查看它是否有效,我看不出任何通过引用传递的理由。 DataGridViewRow 已经是一个引用类型。

标签: c# for-loop datagridview foreach iteration


【解决方案1】:

我同意 cmets 关于不使用 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";
        }
    }

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您不能使用“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
      

      希望对你有帮助

      【讨论】:

      • 顺便说一句,我不会使用“Ref”,而是传递一个 DataGridViewRow 对象以简单地拥有:lstDgr.Add(RowValueSet(dgr));
      【解决方案4】:

      这个怎么样?

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

      【讨论】:

      • 抱歉@Selman22 我通过了它,但是当我为行的单元格分配值时,它并没有将它分配给 Datagridviewcells
      • 它通过了行但值没有分配给datagridview单元格
      • 那么问题可能出在您的 RowValueSet 方法上?你确定它是正确的?
      • 我确信 rowvalueset 没有问题
      猜你喜欢
      • 2011-12-15
      • 2016-04-11
      • 1970-01-01
      • 2019-12-28
      • 2014-03-05
      • 2023-03-24
      • 2013-05-28
      • 2015-01-25
      • 1970-01-01
      相关资源
      最近更新 更多