2008-09-23 94 views
28
string percentage = e.Row.Cells[7].Text; 

我想用GridView做一些動態的東西,所以我已經將一些代碼連接到RowDataBound事件。我試圖從一個特定的單元格獲取值,這是一個TemplateField。但上面的代碼似乎總是返回一個空字符串。在RowDataBound事件中從GridView獲取單元格的值

任何想法?

澄清,這裏是一個有點違規細胞:

<asp:TemplateField HeaderText="# Percentage click throughs"> 
<ItemTemplate> 
    <%# AddPercentClickThroughs((int)Eval("EmailSummary.pLinksClicked"), (int)Eval("NumberOfSends")) %> 
</ItemTemplate> 
</asp:TemplateField> 

與此相關的,沒有人知道是否有行中選擇小區的更好的方法。它吸入放入cell[1]。難道我不能做cell["mycellname"],所以如果我決定改變我的細胞的順序,錯誤不會出現?

+0

你在每一個回傳數據綁定?你甚至有回傳? – 2008-09-23 15:38:04

回答

11

首先,您需要將代碼包裝在LabelLiteral控件中,以便您可以正確引用它。發生的事情是,系統無法跟蹤它,因爲沒有與文本相關的控制。控件的責任是將其內容添加到視圖狀態。

您需要使用gridView.FindControl(「controlName」);在行中獲得控制權。從那裏你可以得到其物業包括Text

您還可以獲取相關行的DataItem屬性,並將其轉換爲適當的類型並直接提取信息。

+0

但是我實際上並沒有在單元格中有一個控件(我知道!),我只是使用一種方法將字符串放在那裏 – qui 2008-09-23 15:31:43

+2

您不需要將代碼封裝在標籤或文字中。請參閱下面的答案。 – Chris 2008-11-03 00:57:57

+0

周解決方案,有更好的方法來做到這一點。 – 2016-12-28 06:45:53

45

爲什麼不直接從數據源中提取數據。

DataBinder.Eval(e.Row.DataItem, "ColumnName") 
+0

它不在數據源中,它是動態生成的,我編輯了我的問題來澄清 – qui 2008-09-23 15:32:20

21

當您使用TemplateField並將文本文本像綁定一樣綁定到它時,asp.net實際上會爲您插入一個控件!它被放入DataBoundLiteralControl中。你可以看到這個,如果你看到調試器附近的代碼行正在獲取空文本。

因此,在不改變你的模板使用控制訪問這些信息,你會投這樣的:

string percentage = ((DataBoundLiteralControl)e.Row.Cells[7].Controls[0]).Text; 

,將讓你的文字!

11

以上是很好的建議,但是您可以在網格視圖中獲取單元格的文本值,而無需將其包裝在文字或標籤控件中。你只需要知道要連接什麼事件。在這種情況下,請使用DataBound事件,如下所示:

protected void GridView1_DataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     if (e.Row.Cells[0].Text.Contains("sometext")) 
     { 
      e.Row.Cells[0].Font.Bold = true; 
     } 
    } 
} 

運行調試程序時,您將看到文本顯示在此方法中。

6

只需使用一個循環來檢查你的電池在例如一個GridView:

for (int i = 0; i < GridView2.Rows.Count; i++) 
{ 
    string vr; 
    vr = GridView2.Rows[i].Cells[4].Text; // here you go vr = the value of the cel 
    if (vr == "0") // you can check for anything 
    { 
     GridView2.Rows[i].Cells[4].Text = "Done"; 
     // you can format this cell 
    } 
} 
1

使用RowDataBound功能與perticular結合細胞的數據,並獲得控制使用 (ASP的控制名稱類似的DropDownList)GridView.FindControl("Name of Control")

0
Label lblSecret = ((Label)e.Row.FindControl("lblSecret")); 
1

我有一個類似的問題,但通過稍微不同的方法找到解決方案。我沒有按照Chris的建議查找控件,而是首先改變了在.aspx頁面中指定字段的方式。我沒有使用<asp:TemplateField ...>標籤,而是將相關字段更改爲使用<asp:BoundField ...>。然後,當我到達RowDataBound事件時,可以直接在單元格中訪問數據。

相關片段:一,aspx頁面:

<asp:GridView ID="gvVarianceReport" runat="server" ... > 
...Other fields... 
    <asp:BoundField DataField="TotalExpected" 
    HeaderText="Total Expected <br />Filtration Events" 
    HtmlEncode="False" ItemStyle-HorizontalAlign="Left" 
    SortExpression="TotalExpected" /> 
... 
</asp:Gridview> 

然後在RowDataBound事件,我可以直接訪問該值:

protected void gvVarianceReport_Sorting(object sender, GridViewSortEventArgs e) 
{ 
    if (e.Row.Cells[2].Text == "0") 
    { 
     e.Row.Cells[2].Text = "N/A"; 
     e.Row.Cells[3].Text = "N/A"; 
     e.Row.Cells[4].Text = "N/A"; 
    } 
} 

如果有人能在爲什麼這個作品發表評論,我會很感激。我不完全理解爲什麼沒有BoundField的值不在綁定後的單元格中,但是您必須通過控件查找它。

0
<asp:TemplateField HeaderText="# Percentage click throughs"> 
    <ItemTemplate> 
    <%# AddPercentClickThroughs(Convert.ToDecimal(DataBinder.Eval(Container.DataItem, "EmailSummary.pLinksClicked")), Convert.ToDecimal(DataBinder.Eval(Container.DataItem, "NumberOfSends")))%> 
    </ItemTemplate> 
</asp:TemplateField> 


public string AddPercentClickThroughs(decimal NumberOfSends, decimal EmailSummary.pLinksClicked) 
{ 
    decimal OccupancyPercentage = 0; 
    if (TotalNoOfRooms != 0 && RoomsOccupied != 0) 
    { 
     OccupancyPercentage = (Convert.ToDecimal(NumberOfSends)/Convert.ToDecimal(EmailSummary.pLinksClicked) * 100); 
    } 
    return OccupancyPercentage.ToString("F"); 
} 
-1
protected void gvbind_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     e.Row.Attributes["onmouseover"] = "this.style.cursor='hand';"; 
     e.Row.Attributes["onmouseout"] = "this.style.textDecoration='none';"; 
     e.Row.Attributes["onclick"] = ClientScript.GetPostBackClientHyperlink(this.gvbind, "Select$" + e.Row.RowIndex); 
    } 
} 
0

如果設置上的ASP屬性可見:綁定列於。像這樣

<asp:BoundField DataField="F1" HeaderText="F1" Visible="False"/> 

得到的細胞任何文本[我]。文本屬性,當你循環的行。所以

foreach (GridViewRow row in myGrid.Rows) 
{ 
    userList.Add(row.Cells[0].Text); //this will be empty "" 
} 

但是你可以設置爲不通過電網連接到事件可見一列OnRowDataBound然後從這裏做這個

e.Row.Cells[0].Visible = false //now the cell has Text but it's hidden 
相關問題