iT邦幫忙

0

[C#] GridView 按下選取,傳值給DetailsView

我在同一頁設計一個 DetailsView1 (預設為新增模式)、GridView1、GridView2
當每日 DetailsView1 新增的資料,都會顯示在 GridView1 上

GridView2設計了一個搜尋,為多個SQL Table join出來的8個值
按下GridView2欄位內的選取後,要傳給 DetailsView1 的8個 TextBox

DetailsView1(已經轉成樣板)要接收的名稱是
TextBox4、TextBox41、TextBox5、TextBox51、TextBox6、TextBox61、TextBox8、TextBox14

protected void Button1_Click(object sender, EventArgs e)
{
  for (int i = 0; i < GridView2.Rows.Count; i++)
  {
    string strValue = GridView2.Rows[i].Cells[0].Text.ToString().Trim();
    TextBox TB4 = (TextBox)DetailsView1.FindControl("TextBox4");    
    TextBox TB41 = (TextBox)DetailsView1.FindControl("TextBox41");  
    TextBox TB5 = (TextBox)DetailsView1.FindControl("TextBox5");    
    TextBox TB51 = (TextBox)DetailsView1.FindControl("TextBox51");  
    TextBox TB6 = (TextBox)DetailsView1.FindControl("TextBox6");    
    TextBox TB61 = (TextBox)DetailsView1.FindControl("TextBox61");  
    TextBox TB8 = (TextBox)DetailsView1.FindControl("TextBox8");    
    TextBox TB14 = (TextBox)DetailsView1.FindControl("TextBox14");  
    TB4.Text = (strValue[0].ToString());                            
    TB41.Text = (strValue[1].ToString());                           
    TB5.Text = (strValue[2].ToString());                            
    TB51.Text = (strValue[3].ToString());                           
    TB6.Text = (strValue[4].ToString());                            
    TB61.Text = (strValue[5].ToString());                           
    TB8.Text = (strValue[6].ToString());                            
    TB14.Text = (strValue[7].ToString());                           
  }
}

前面程式都正常,當搜尋到資料後,在GridView2下選擇其中一筆資料,按下選取後,會出現
https://ithelp.ithome.com.tw/upload/images/20200818/20082456hSN1bDFWoH.jpg

--懇請大師指點12~~謝謝

看更多先前的討論...收起先前的討論...
archer9080 iT邦研究生 4 級 ‧ 2020-08-18 15:13:03 檢舉
strValue 可能有問題(?)
IndexOutOfRangeException出現 通常都是指array有問題
glj8989332 iT邦研究生 4 級 ‧ 2020-08-18 15:36:29 檢舉
應該要用Debug看看strValue的值是什麼~ Exception的說明很清楚是這陣列索引有問題
strValue可能是空白或NULL空值,所以 strValue[0] 為超過索引值界限
阿偉 iT邦新手 2 級 ‧ 2020-08-18 17:58:21 檢舉
是選取那格按鈕沒辦法寫入strValue內嗎?
如果是該如何避過?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
japhenchen
iT邦超人 1 級 ‧ 2020-08-18 16:17:53

strValue可能是0長度字串或NULL空值,所以 strValue[0] 為超過索引值界限

所以你該做的事,就是

    if(strValue!=null)
    {
        if(strValue.Length>0)
            TB4.Text = (strValue[0].ToString());                            
        if(strValue.Length>1)
            TB41.Text = (strValue[1].ToString());                           
        if(strValue.Length>2)
            TB5.Text = (strValue[2].ToString());                            
        if(strValue.Length>3)
            TB51.Text = (strValue[3].ToString());                       
        if(strValue.Length>4)        
            TB6.Text = (strValue[4].ToString());                            
            
            // ............................後面偷懶1000001行
    }

....回覆自殺

阿偉 iT邦新手 2 級 ‧ 2020-08-18 17:41:26 檢舉

但我的資料內都有值,且SQL都不允許null

0
Zed_Yang
iT邦新手 3 級 ‧ 2020-08-18 16:42:56
//你迴圈strValue 都還沒全部塞完東西 就急著把值給其他人當然壞
protected void Button1_Click(object sender, EventArgs e)
{
  for (int i = 0; i < GridView2.Rows.Count; i++)
  {
    string strValue = GridView2.Rows[i].Cells[0].Text.ToString().Trim();
    TextBox TB4 = (TextBox)DetailsView1.FindControl("TextBox4");    
    TextBox TB41 = (TextBox)DetailsView1.FindControl("TextBox41");  
    TextBox TB5 = (TextBox)DetailsView1.FindControl("TextBox5");    
    TextBox TB51 = (TextBox)DetailsView1.FindControl("TextBox51");  
    TextBox TB6 = (TextBox)DetailsView1.FindControl("TextBox6");    
    TextBox TB61 = (TextBox)DetailsView1.FindControl("TextBox61");  
    TextBox TB8 = (TextBox)DetailsView1.FindControl("TextBox8");    
    TextBox TB14 = (TextBox)DetailsView1.FindControl("TextBox14");  
    TB4.Text = (strValue[0].ToString());         
    //第一次近來 i = 0 當然只有strValue[0]有值
    TB41.Text = (strValue[1].ToString());                           
    TB5.Text = (strValue[2].ToString());                            
    TB51.Text = (strValue[3].ToString());                           
    TB6.Text = (strValue[4].ToString());                            
    TB61.Text = (strValue[5].ToString());                           
    TB8.Text = (strValue[6].ToString());                            
    TB14.Text = (strValue[7].ToString());                           
  }
}

調整
至於要不要額外增加樓上回答的檢核就看你的需求

protected void Button1_Click(object sender, EventArgs e)
{
  for (int i = 0; i < GridView2.Rows.Count; i++)
  {
    string strValue = GridView2.Rows[i].Cells[0].Text.ToString().Trim();   
  }
   TextBox TB4 = (TextBox)DetailsView1.FindControl("TextBox4");    
    TextBox TB41 = (TextBox)DetailsView1.FindControl("TextBox41");  
    TextBox TB5 = (TextBox)DetailsView1.FindControl("TextBox5");    
    TextBox TB51 = (TextBox)DetailsView1.FindControl("TextBox51");  
    TextBox TB6 = (TextBox)DetailsView1.FindControl("TextBox6");    
    TextBox TB61 = (TextBox)DetailsView1.FindControl("TextBox61");  
    TextBox TB8 = (TextBox)DetailsView1.FindControl("TextBox8");    
    TextBox TB14 = (TextBox)DetailsView1.FindControl("TextBox14");  
    TB4.Text = (strValue[0].ToString());         
    TB41.Text = (strValue[1].ToString());                           
    TB5.Text = (strValue[2].ToString());                            
    TB51.Text = (strValue[3].ToString());                           
    TB6.Text = (strValue[4].ToString());                            
    TB61.Text = (strValue[5].ToString());                           
    TB8.Text = (strValue[6].ToString());                            
    TB14.Text = (strValue[7].ToString());                           
}
看更多先前的回應...收起先前的回應...
Zed_Yang iT邦新手 3 級 ‧ 2020-08-18 16:44:01 檢舉

至於strValue 到底有沒有成功帶值進去
還是要Debug模式下中斷點才知道

阿偉 iT邦新手 2 級 ‧ 2020-08-18 17:38:35 檢舉

把變數提出,改成下方,還是一樣
真怪
我最後一格是選取按鈕
是選取按鈕沒辦法放進strValue內嗎?
https://ithelp.ithome.com.tw/upload/images/20200818/20082456xv6OtbdMgr.jpg

protected void Button1_Click(object sender, EventArgs e)
{
  string strValue = null;
  for (int i = 0; i < GridView2.Rows.Count; i++)
  {
    strValue = GridView2.Rows[i].Cells[0].Text.ToString().Trim();
  }
  TextBox TB4 = (TextBox)DetailsView1.FindControl("TextBox4");
  TextBox TB41 = (TextBox)DetailsView1.FindControl("TextBox41");
  TextBox TB5 = (TextBox)DetailsView1.FindControl("TextBox5");
  TextBox TB51 = (TextBox)DetailsView1.FindControl("TextBox51");
  TextBox TB6 = (TextBox)DetailsView1.FindControl("TextBox6");
  TextBox TB61 = (TextBox)DetailsView1.FindControl("TextBox61");
  TextBox TB8 = (TextBox)DetailsView1.FindControl("TextBox8");
  TextBox TB14 = (TextBox)DetailsView1.FindControl("TextBox14");
  TB4.Text = strValue[1].ToString();
  TB41.Text = strValue[2].ToString();
  TB5.Text = strValue[3].ToString();
  TB51.Text = strValue[4].ToString();
  TB6.Text = strValue[5].ToString();
  TB61.Text = strValue[6].ToString();
  TB8.Text = strValue[7].ToString();
  TB14.Text = strValue[8].ToString();
}
阿偉 iT邦新手 2 級 ‧ 2020-08-18 17:52:10 檢舉

抱歉,剛接觸ASPNET
沒DEBUG過,初步看好像還是顯示一樣的問題
https://ithelp.ithome.com.tw/upload/images/20200818/20082456lwvnlvuoNa.png

archer9080 iT邦研究生 4 級 ‧ 2020-08-19 09:32:04 檢舉

不好意思請教一下大大
可是他的錯誤訊息是在(strValue[0].ToString())就有了
不是代表strValue[0]就有問題了嗎?

阿偉 iT邦新手 2 級 ‧ 2020-08-19 09:49:02 檢舉

strValue = GridView2.Rows[i].Cells[0].Text.ToString().Trim();
應該沒問題
只取值,不寫入
不會出錯

archer9080 iT邦研究生 4 級 ‧ 2020-08-19 09:54:20 檢舉

那你strValue.Length output是?
strValue感覺是個字串不是陣列呀

阿偉 iT邦新手 2 級 ‧ 2020-08-19 11:46:00 檢舉

感謝提醒,一開始沒用陣列,所以值放不下
修正後又測試了一些語法
感覺是

(strValue[0].ToString())

的問題
因為值傳不進TextBox裡
點按鈕沒反應

0
archer9080
iT邦研究生 4 級 ‧ 2020-08-19 10:32:09

我猜您的寫法是參考這篇

幫您找到這篇

我猜您strValue宣告的應該不是陣列

依照我的理解修改過後如下

protected void Button1_Click(object sender, EventArgs e){

  string[] strValue = new string[GridView2.Rows.Count];
  
  for (int i = 0; i < GridView2.Rows.Count; i++){
      
    strValue[i] = GridView2.Rows[i].Cells[0].Text.ToString().Trim();
    
  }
    TextBox TB4 = (TextBox)DetailsView1.FindControl("TextBox4");    
    TextBox TB41 = (TextBox)DetailsView1.FindControl("TextBox41");  
    TextBox TB5 = (TextBox)DetailsView1.FindControl("TextBox5");    
    TextBox TB51 = (TextBox)DetailsView1.FindControl("TextBox51");  
    TextBox TB6 = (TextBox)DetailsView1.FindControl("TextBox6");    
    TextBox TB61 = (TextBox)DetailsView1.FindControl("TextBox61");  
    TextBox TB8 = (TextBox)DetailsView1.FindControl("TextBox8");    
    TextBox TB14 = (TextBox)DetailsView1.FindControl("TextBox14");  
    TB4.Text = (strValue[0].ToString());         
    TB41.Text = (strValue[1].ToString());                           
    TB5.Text = (strValue[2].ToString());                            
    TB51.Text = (strValue[3].ToString());                           
    TB6.Text = (strValue[4].ToString());                            
    TB61.Text = (strValue[5].ToString());                           
    TB8.Text = (strValue[6].ToString());                            
    TB14.Text = (strValue[7].ToString());                           
}

因為還未接觸到 ASP.NET所以經驗不足
可能理解或回答有誤再麻煩前輩們輕鞭:D

看更多先前的回應...收起先前的回應...
阿偉 iT邦新手 2 級 ‧ 2020-08-19 11:45:47 檢舉

感謝提醒,一開始沒用陣列,所以值放不下
修正後又測試了一些語法
感覺是

(strValue[0].ToString())

的問題
因為值傳不進TextBox裡
點按鈕沒反應

archer9080 iT邦研究生 4 級 ‧ 2020-08-19 13:13:45 檢舉

沒有報錯以及確認您的按鈕函式在正常情況下沒有問題
嘗試以下做法
1.先當strValue[0].ToString()出錯,因此試試

TB4.Text = "123";     

(1)無東西的話(應該是會有)
代表(TextBox)DetailsView1.FindControl("TextBox4")有問題
不過我剛找了一下FindControl的用法,這段應該不會有問題才對
更有可能的是您的function跟按鈕根本沒連結到

(2)有東西的話試試

TB4.Text = strValue[0].ToString();
/*or*/
TB4.Text = strValue[0];
/*還是不行的話再麻煩您先將strValue[0] output出來
看值到底長怎樣*/

因為我也沒寫過ASP.NET,不熟語法,加上沒有環境測試
以上皆為個人猜測
只能一步一步拆(猜),看到哪邊之前是OK哪邊之後才有錯誤

阿偉 iT邦新手 2 級 ‧ 2020-08-19 14:12:30 檢舉

稍微側了一下

string[] strValue = { "AAA", "BBB", "CCC", "DDD", "EEE", "FFF" };

TextBox TB4 = (TextBox)DetailsView1.FindControl("TextBox4");
TextBox TB41 = (TextBox)DetailsView1.FindControl("TextBox41");
TextBox TB5 = (TextBox)DetailsView1.FindControl("TextBox5");

TB4.Text = strValue[0].ToString();
TB41.Text = strValue[1].ToString();
TB5.Text = strValue[2];

可以傳資料AAA.BBB.CCC到各個TextBox內
所以看來應該是上方陣列根本沒取到GridView2的值

archer9080 iT邦研究生 4 級 ‧ 2020-08-19 15:02:25 檢舉

也就是說

for (int i = 0; i < GridView2.Rows.Count; i++){
      
    strValue[i] = GridView2.Rows[i].Cells[0].Text.ToString().Trim();
    
}

這段出了問題

那你將GridView2.Rows.Count輸出出來
看值是多少

或是試試
strValue[0] = GridView2.Rows[0].Cells[0].Text.ToString().Trim();
並輸出出來

/images/emoticon/emoticon06.gif

阿偉 iT邦新手 2 級 ‧ 2020-08-19 15:08:19 檢舉

我嘗試用兩個for寫,一樣取不到值
我的想法是
GridView2.Rows.Count→取得第i行
GridView2.Columns.Count→取得第j列
所以延伸出
strValue[i] = GridView2.Rows[i].Cells[j].Text.ToString();
我先取得第i行後,在取得第j列的資料
最後strValue[2].ToString() 才會有資料
結果還是沒資料@@

string[] strValue = new string[GridView2.Columns.Count];
for (int i = 0; i < GridView2.Rows.Count; i++)
{
 for (int j = 0; j < GridView2.Columns.Count; j++)
 {
    strValue[i] = GridView2.Rows[i].Cells[j].Text.ToString();
 }
}
TextBox TB4 = (TextBox)DetailsView1.FindControl("TextBox4");
TB4.Text = strValue[1].ToString();
阿偉 iT邦新手 2 級 ‧ 2020-08-19 15:11:36 檢舉

如果用strValue[0]
會顯示
並未將物件參考設定為物件的執行個體。

archer9080 iT邦研究生 4 級 ‧ 2020-08-19 15:16:14 檢舉

你越寫越混亂了......

先試試GridView2.Rows[0].Cells[0].Text.ToString().Trim()到底有沒有值

再來考慮要取哪裡

archer9080 iT邦研究生 4 級 ‧ 2020-08-19 15:38:22 檢舉

如果用strValue[0]
會顯示
並未將物件參考設定為物件的執行個體

應該您沒宣告陣列大小
也就是說要不是GridView2.Rows.Count就是 GridView2.Columns.Count有問題
如何檢查問題?將它輸出就知道了/images/emoticon/emoticon06.gif

參考資料

阿偉 iT邦新手 2 級 ‧ 2020-08-19 15:42:47 檢舉

沒取到值
後來改成正確的
GridView2.Columns.Count是每行欄位數
所以這個才夠放

string[] strValue = new string[GridView2.Columns.Count];

不過還是沒取到值
目前先用一格一格的方式取值
徒法煉鋼@@~
有空再回來試這一筆

archer9080 iT邦研究生 4 級 ‧ 2020-08-19 16:22:52 檢舉

哈哈 我對這語法並不熟悉,所以我也怕我把您越帶越偏

因為目前看起來問題越挖越大,建議您參考一下
(1)提供您DetailsView1、GridView1、GridView2的code
(2)以圖示方式加以敘述樣板之間想如何傳送接收資訊
(3)結合目前的程式碼及遇到的問題重新發問

我要發表回答

立即登入回答