2012-12-10 65 views
1

試圖從gridview中的標籤傳遞參數,只傳遞第一行的標籤文本。從gridview傳遞參數

不確定缺少什麼。

protected void GV1_OnRowCommand(object sender, GridViewCommandEventArgs e) 
    { 
     if (e.CommandName == "edit") 
     { 


      foreach (GridViewRow row in GridView1.Rows) 
      { 
       if (row.RowType == DataControlRowType.DataRow) 
       { 
        Label lbl_taskID = (Label)row.FindControl("lbl_taskID"); 

        Session["TaskID"] = lbl_taskID.Text; 

        Response.Redirect("~/tasks_edit.aspx"); 
       } 
      } 
     } 
    } 
+0

你調試了你的代碼嗎?哪一行發生錯誤?你的錯誤信息是什麼?要特別。 –

+0

完全沒有錯誤 –

回答

0

我從GridView控件嚮導使用自動生成的編輯按鈕,這是工作。

對不起您的時間浪費。

1

您正在打破循環與Response.Redirect你需要把該做Response.Redirect出側循環設置所有的值,你還需要連接上,書寫lbl_taskID所有行,而不是價值。

protected void GV1_OnRowCommand(object sender, GridViewCommandEventArgs e) 
{ 
    string taskIds = string.Empty; 
    if (e.CommandName == "edit") 
    { 


     foreach (GridViewRow row in GridView1.Rows) 
     { 
      if (row.RowType == DataControlRowType.DataRow) 
      { 
       Label lbl_taskID = (Label)row.FindControl("lbl_taskID"); 

       if(Session["TaskID"] != null) 
        taskIds = Session["TaskID"].ToString(); 
       Session["TaskID"] = taskIds + lbl_taskID.Text + ",";     
      } 
     } 
     Response.Redirect("~/tasks_edit.aspx"); 
    } 
} 
+0

可以請你編輯上面的代碼 –

+0

我已經把響應。在循環外部重定向,但仍然得到第一行文本 –

+0

抱歉,但我是一個noob –

0

您使用的是foreach循環,但您使用的是循環到一個單一的值賦給一個Session變量。那麼你期望什麼?

但是,我會假設你的最後一行不是第一行。

您需要將Response.Redirect("~/tasks_edit.aspx")放在循環之外,因爲它會中止當前請求。您可能要指定這是目前在編輯模式下排:

foreach (GridViewRow row in gridView1.Rows) 
{ 
    if (row.RowState == DataControlRowState.Edit) 
    { 
     Label lbl_taskID = (Label)row.FindControl("lbl_taskID"); 
     Session["TaskID"] = lbl_taskID.Text; 
     break; 
    } 
} 
Response.Redirect("~/tasks_edit.aspx"); 

側面說明:你不需要檢查DataControlRowType因爲GridView.Rows只有DataControlRowType.DataRow返回行反正(不像RowDataBound -event)。

編輯:你爲什麼使用foreach循環

protected void EditLink_Clicked(Object sender, EventArgs e) 
{ 
    // get the LinkButton reference 
    LinkButton link = (LinkButton) sender; 
    // get the GridViewRow reference via NamingContainer 
    GridViewRow row = (GridViewRow) link.NamingContainer; 
    Label lbl_taskID = (Label) row.FindControl("lbl_taskID"); 
    Session["TaskID"] = lbl_taskID.Text; 
    Response.Redirect("~/tasks_edit.aspx"); 
} 
+0

讓我們從頭開始:gridview的每一行都有鏈接按鈕,用於編輯記錄,使用帶有記錄ID的標籤文本,試圖將該ID傳遞到編輯頁面tasks_edit.aspx –

+0

那麼,爲什麼不使用'超鏈接'''Click''事件呢?我相應地編輯了我的答案。 –

0

如果只使用第一行,然後:與其RowCommand我會用LinkButton的單擊事件?你可以簡單地find the control of the 0th row.

if (e.CommandName == "edit") //this makes sure that you have a row 
{ 
    Label lbl_taskID = (Label)GridView1.Rows[0].FindControl("lbl_taskID"); 
    Session["TaskID"] = lbl_taskID.Text; 
    Response.Redirect("~/tasks_edit.aspx"); 
} 

如果從當前編輯欄則意味着標籤文本,take the index of the editing columnCommandArgument和獲取標籤

if (e.CommandName == "edit") //this makes sure that you have a row 
{ 
     int index = Convert.ToInt32(e.CommandArgument); //currently editing row index 
     Label lbl_taskID = (Label)GridView1.Rows[index].FindControl("lbl_taskID"); 
     Session["TaskID"] = lbl_taskID.Text; 
     Response.Redirect("~/tasks_edit.aspx"); 
} 
0

你怎麼有每一行中lbl_taskID?在你的foreach循環您doing-

Label lbl_taskID = (Label)row.FindControl("lbl_taskID"); 

你實際上只服用lbl_taskID目前的第一行中的值。下一行將不再有相同的元素。你的編碼是錯誤的。您需要將您的姓名標籤的每一行與像一些事情這個 - label0label1 ...然後在你的代碼,你可以做 -

  int i=0; 
      foreach(GridViewRow row in GridView1.Rows) 
      { 
       Label xyz = (Label)row.FindControl("Label"+i); 
       Session["TaskID"+i] =xyz.Text; //to have unique session variables 
       i++; 
      } 
      Response.Redirect("~/tasks_edit.aspx"); // you should redirect only when you come out of the loop