2011-03-14 175 views
0

我有一個顯示一些值的網格視圖。現在我必須計算每行的這些值的行明智總和,然後顯示它們。如何在網格視圖中計算行的總和值並將其顯示在網格視圖中?

我試過這段代碼,但由於輸入字符串的格式不正確而出現錯誤。

public void gv_RowCreated(Object sender, GridViewRowEventArgs e) 
{ 

    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     int total = Convert.ToInt32(e.Row.Cells[1].Text) + Convert.ToInt32(e.Row.Cells[2].Text) + Convert.ToInt32(e.Row.Cells[3].Text) + Convert.ToInt32(e.Row.Cells[4].Text) + Convert.ToInt32(e.Row.Cells[5].Text) + Convert.ToInt32(e.Row.Cells[6].Text) + Convert.ToInt32(e.Row.Cells[7].Text); 

     ((Label)gv.FindControl("Label8")).Text = Convert.ToString(total); 

    } 
} 
+1

您能通過示例代碼解釋一下嗎? – 2011-03-14 09:21:35

回答

0

試圖通過設置以下代碼到Label8的項目模板:

<asp:TemplateField HeaderText="Col8"> 
       <ItemTemplate> 
        <%# Convert.ToInt32(Eval("col1")) + Convert.ToInt32(Eval("col2")) + ... %> 
       </ItemTemplate> 
      </asp:TemplateField> 
</asp:TemplateField> 

檢查它是否正常工作。

+0

此代碼非常感謝。 – user272315 2011-03-14 10:07:11

0

我從想要的值相加在,而不是值的列(這是比較常用的)你的問題假設。

您的網格將綁定到IEnumerable對象列表,這些對象的屬性將形成網格的列。

這樣做的簡單方法是在數據對象上再添加一個屬性,該屬性可以是其他屬性的總和 - 因此您具有計算屬性。

但是,您可能希望將此屬性顯示爲網格中的最後一列,爲了可靠地執行此操作(以非黑客方式),您需要專門聲明列,即您必須設置AutoGenerateColumns假。

編輯:看你的代碼後,

我不得不說這是一個有點醜陋的方式做到這一點(以這種方式和處理網格行很慢)。更好的方法是將計算的屬性包含在數據對象中,並將計算封裝在那裏,因爲您的網格僅用於顯示,並且不需要對這些值本身有任何瞭解。

下面是一個例子的數據對象給你什麼,我的意思是,我已經混了數據類型有些只是爲了讓一個想法要複雜一點:

public class MyDataObject 
{ 
    public int MyValue1 { get; set; } 

    public string MyValue2 { get; set; } 

    public decimal MyValue3 { get; set; } 

    public decimal MyTotal 
    { 
     get 
     { 
      return MyValue1 
        + MyValue3 
        + (string.IsNullOrWhiteSpace(MyValue2) ? 0 : Convert.ToInt32(MyValue2)); 
     } 
    } 

    //alternate version: 
    public decimal MyTotal2 
    { 
     get 
     { 
      return MyValue1 + MyValue3 + ConvertToInt(MyValue2, 0); 
     } 
    } 

    //helper method: 
    private int ConvertToInt(string input, int defaultVal) 
    { 
     int temp = 0; 
     if (int.TryParse(input, out temp)) 
      return temp; 
     return defaultVal; 

     //this can also be written more succinctly as: 
     //return int.TryParse(input, out temp) ? temp : defaultVal; 
    } 
} 
+0

我已將AutoGenerateColumns設置爲false,並且使用以上代碼與此代碼我可能會出現錯誤,因爲「輸入字符串格式不正確」 – user272315 2011-03-14 09:39:44

+0

@user - 檢查我的編輯。 – slugster 2011-03-14 10:02:01

+0

感謝您回答我的問題。 – user272315 2011-03-14 10:08:00

0

使用這種代碼是,

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     Label lblTotal = (Label)e.Row.FindControl("lblTotal"); 
     int iCount; 
     if (Decimal.TryParse(lblTotal.Text, iCount)) { 
      iCount += iCount; 
     } 
    } 
    if (e.Row.RowType == DataControlRowType.Footer) 
    { 
     Label lblTotalAmt = (Label)e.Row.FindControl("lblTotalAmt"); 
     lblTotalAmt.Text = iCount.ToString(); 
    } 
}