【问题标题】:Saving GridView cell value in a list将 GridView 单元格值保存在列表中
【发布时间】:2013-01-15 09:08:04
【问题描述】:

我想将 GridView 单元格保存在一个列表中,以便与另一个列表进行比较。

这是我尝试过的:

        BudgetCommessa budgetCommessa = new BudgetCommessa();
        List<BudgetCommessa> listaDaGridView = new List<BudgetCommessa>();
        for (int i = 1; i <= preventivoView.Rows.Count; i++)
        {
            budgetCommessa.Task = Convert.ToString(preventivoView.SelectedRow.Cells[0].Text);//SelectedDataKey.Values[0]);
            listaDaGridView.Add(budgetCommessa);
        }

但即使填充了 GridView 的单元格 (0,0),我也会收到 NullReferenceException

【问题讨论】:

  • 这是针对单个单元格的,如果它可以正常工作,我将实现其他单元格
  • 在您调用Convert.ToString() 的行上放置一个调试点,将鼠标悬停在SelectedRow 上或在您的即时窗口中输入?preventivoView.SelectedRow
  • @LukeHennerley 它说“null”,但我真的不明白为什么,这是一个没有空值的巨大填充网格视图
  • 虽然您有很多数据,但您可能无法选择单行。这将取决于您在 gridview 本身上没有用户可以单击的 Select 列。

标签: c# asp.net gridview null nullreferenceexception


【解决方案1】:

您应该检查您的 gridview 是否有任何选定的行。除此之外,您的代码中还有其他问题:

  1. 循环应从 0 开始,并应以 Rows.Count - 1 继续。
  2. 你应该在 for 循环中实例化budgetCommesa,否则你会得到一个对象列表都指向同一个值。

所以你的代码应该是这样的:

for (int i = 0; i < preventivoView.Rows.Count; i++)
 {
        if(preventivoView.SelectedRow != null)
            {            
            BudgetCommessa budgetCommessa = new BudgetCommessa();
            budgetCommessa.Task = Convert.ToString(preventivoView.SelectedRow.Cells[0].Text);//SelectedDataKey.Values[0]);
            listaDaGridView.Add(budgetCommessa);
            }
 }

如果您希望从所有行的单元格中获取值,而不管选择的然后,您必须迭代每一行,而不是 SelectedRow:

for (int i = 0; i < preventivoView.Rows.Count; i++)
 {
    BudgetCommessa budgetCommessa = new BudgetCommessa();
    budgetCommessa.Task = Convert.ToString(preventivoView.Rows[i].Cells[0].Text);//SelectedDataKey.Values[0]);
    listaDaGridView.Add(budgetCommessa);
 }

【讨论】:

  • +1 用于代码建议,但这并不能完全解决他的问题 :)
  • @user1711154,检查编辑的答案,我相信你正在尝试迭代每一行,而不是 SelectedRow。
  • @LukeHennerley,我只能猜测出了什么问题。我相信 OP 正在尝试迭代每一行,而不是 SelectedRow,这就是我在编辑后的答案中所做的
  • 是的,我犯了一个错误,因为我的英语很糟糕,对不起大家。 @Habib 你让我开心。非常感谢
【解决方案2】:

试试这个:

    budgetCommessa.Task = preventivoView.Rows[i].Cells[0].Text;

希望对您有所帮助。

【讨论】:

    【解决方案3】:

    如果您想使用选定的行,那么您需要在网格中添加一个按钮字段。

    <asp:GridView ID="GridView1" runat="server" OnSelectedIndexChanged="SelectedRow_changed">
        <Columns>
            <asp:ButtonField ButtonType="Button" CommandName="Select" HeaderText="Select Row"
                Text="Select" />
        </Columns>
    </asp:GridView>
    

    然后更改所选行的事件。

    public void SelectedRow_Changed(object sender, GridViewSelectEventArgs e)
    {
      GridViewRow row = CustomersGridView.Rows[e.NewSelectedIndex];
      BudgetCommessa budgetCommessa = new BudgetCommessa();
      //Would of shifted one because of the new button column
      budgetCommessa.Task = Convert.ToString(row.Cells[1].Text);
    }
    

    如果您想引用每一行并遍历它们,请使用 Habib 的答案,因为这是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多