2012-10-09 46 views
0

我试图通过gridview循环并一次保存所有项目。不过,我有一个问题,从下拉列表和文本框中获取值。ASP.Net获取值ArgumentOutOfRangeException抛出抛出

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); 
    } 
    ... 
} 

两个文本框和dropdownlists是在rowbound动态创建的,如果该事项。

TIA

+1

你会更好地使用GridViewRow.FindControl()服务,并通过名称查找控件,而不是通过索引使用Controls [index]来引用它您可能需要将列转换为TemplateColumns才能使其工作,但它是在我的经验中更容易,更不容易出错。 http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridviewrow.findcontrol.aspx也见http://stackoverflow.com/questions/1965835/find-control-inside-grid -row – David

+2

不要在'RowDataBound'中创建它们,而要在'RowCreated'中创建它们。只有当GridView是数据绑定时才会调用前者。后者在每一次回传中都会被调用。 –

回答

1

不知道正是其中一线抛出异常,它很难与同等精度的诊断,但什么是有可能发生的事情是,你正在寻找一个细胞控制不具有任何控制。

这怎么会出现?那么,因为你在创建RowDataBound中的控件,所以如果你没有在每次回发时绑定你的网格(并且我不建议你这样做),你的动态添加的控件将不会在回发时被重新创建。发布的数据将包含这些控件的值,而ViewState将包含这些控件的数据,但是如果在每次回发时不重新创建这些控件,那么当您尝试访问其值时,这些控件将不存在。

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

+0

谢谢你们的帮助。异常不再被抛出,但我无法从下拉列表中获得值。我用它来捕捉价值,但它似乎没有工作出于某种原因。该值永远不会改变。 'division =((DropDownList)gvr.Cells [1] .Controls [0])。SelectedValue;' – jclifford90

+0

你什么时候检查值?在页面的生命周期的哪个阶段? –

+0

我检查页面加载后按钮单击时的值,用户选择一个值并将数据输入到文本框中。文本框的值被捕获得很好。 – jclifford90

相关问题