2012-10-09 140 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

相關問題