【问题标题】:ASP.Net Get Values ArgumentOutOfRangeException ThrownASP.Net 获取值 ArgumentOutOfRangeException 引发
【发布时间】:2012-10-09 21:01:41
【问题描述】:

我正在尝试遍历 gridview 并一次保存其中的所有项目。但是,我从下拉列表和文本框中获取值时遇到问题。我每次都会收到这个错误:

ArgumentOutOfRangeException was caught. Specified argument was out of the range of valid values.

这是我正在使用的代码:

foreach (GridViewRow gvr in gvInvalidOrgs.Rows)
{
   try
    {
     org_code = Convert.ToInt32(gvr.Cells[0].Text);
     division = ((DropDownList)gvr.Cells[1].Controls[0]).SelectedValue;
     org_description = (((TextBox)gvr.Cells[2].Controls[0]).Text);
    }
    ...
}

如果重要的话,文本框和下拉列表都是在行绑定上动态创建的。

TIA

【问题讨论】:

  • 您最好使用 GridViewRow.FindControl() 并按名称查找控件,而不是使用 Controls[index] 通过索引引用它 您可能需要将列转换为 TemplateColumns 以获取它工作,但根据我的经验,它更容易,更不容易出错。 msdn.microsoft.com/en-us/library/… 另见stackoverflow.com/questions/1965835/…
  • 不要在RowDataBound 中创建它们,而是在RowCreated 中创建它们。只有当 GridView 是数据绑定时才会调用前者。每次回发时都会调用后者。

标签: asp.net gridview


【解决方案1】:

如果不确切知道异常是在哪一行引发的,就很难以同样的精度进行诊断,但很可能发生的情况是,您正在寻找一个没有任何控件的单元格中的控件。

这是怎么回事?好吧,由于您在RowDataBound 中创建控件,如果您没有在每次回发时绑定您的网格(我不建议您这样做),您的动态添加的控件将不会在回发时重新创建。发布的数据将包含这些控件的值,而 ViewState 将包含这些控件的数据,但如果您不在每次回发时重新创建这些控件,那么当您尝试访问它们的值时,这些控件将不存在。

但您不必重新绑定即可重新创建控件。正如 Schmelter 先生在他的评论中所说,如果您将控件的创建从 RowDataBound 移动到 RowCreated 事件处理程序,它们将在回发时重新创建网格行时创建。

【讨论】:

  • 感谢两位的帮助。不再抛出异常,但我无法从下拉列表中获取值。我用它来捕获价值,但由于某种原因它似乎不起作用。价值永远不会改变。 division = ((DropDownList)gvr.Cells[1].Controls[0]).SelectedValue;
  • 你什么时候检查值?处于页面生命周期的哪个阶段?
  • 我在页面加载后单击按钮检查值,用户选择一个值并将数据输入到文本框中。文本框的值被很好地捕获。
  • 如何创建下拉列表的值?你把它绑定到什么东西上吗?
  • protected void gvInvalidOrgs_RowCreated(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { DropDownList ddlDivision = new DropDownList(); ListItem blank = new ListItem("", "-1"); ddlDivision.Items.Add(blank); foreach (DataRow dr in dtDivisions.Rows) { ListItem li = new ListItem(dr["division"].ToString(), dr["division"].ToString()); ddlDivision.Items.Add(li); } e.Row.Cells[0].Controls.Add(ddlDivision); TextBox tbDescription = new TextBox(); tbDescription.Width = 200; e.Row.Cells[1].Controls.Add(tbDescription); } }
猜你喜欢
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
相关资源
最近更新 更多