Search code examples
c#winformsdatatabledatacolumn

How to make addition of two columns data for another column where those two columns are type of string?


I have datatable and there two column which is type of string and I want to make addition of that two columns data for another column how can I do that ?

My column name contains special character and I have used "[" "]" to escaping special character and my columns are type of decimal I am doing

 TableExtractedFromFile.Columns[TOT BROK(Rs)].Expression = 
                "'"+"["+SER TAX(Rs)+"]"+"'+'"+"["+STT(Rs)+"]"+"'";

But The column TOT BROK(Rs) contains the contenation of values of columns SER TAX(Rs) and STT(Rs).But I want the sum of the values of these two columns.

EDIT It works. But If I do like there is three columns A,B and C. Now if do I table.columns["A"].expression = "A+B+C"; then it gives error like Cannot set Expression property due to circular reference in the expression. then what is the solution of that ?


Solution

  • Use this:

    dt.Columns.Add("fullname", typeof(string));
    dt.Columns["fullname"].Expression = "lastname + ', ' + firstname";
    

    For adding of value(Total,Amount and Surcharge are your existing columns, and are type string, you need to put CONVERT function in your column names so they will be casted to decimal(System.Decimal), if int use System.Int32 or System.Int64, etc):

    dt.Columns["Total"].Expression = 
      "CONVERT(Amount,System.Decimal) + CONVERT(Surcharge,System.Decimal)";
    

    [EDIT]

    Just do it in your backend:

        select *, CONVERT(SERTAX(Rs), DECIMAL) 
            + CONVERT(STT(Rs), DECIMAL) AS brokerage 
        from tbl
    

    If you have control in your database, modify the SERTAX and STT function so it can return decimal/currency/int, not string.

    Then in your front-end, do this:

    dt.ColumnChanging += (ds, de) =>
    {
        if (de.Column.ColumnName == "Rs")
        {
            decimal serTaxResult = (decimal)new SqlCommand("select SERTAX(" + de.ProposedValue + ")").ExecuteScalar();
            decimal sttResult = (decimal)new SqlCommand("select STT(" + de.ProposedValue + ")").ExecuteScalar();
    
            // if your SERTAX AND STT really return string, use this:                        
            // decimal serTaxResult = decimal.Parse( (string) new SqlCommand("select SERTAX(" + de.ProposedValue + ")").ExecuteScalar() );
            // decimal sttResult = decimal.Parse( (string) new SqlCommand("select STT(" + de.ProposedValue + ")").ExecuteScalar() );
    
    
            de.Row["brokerage"] = serTaxResult + sttResult;
        }
    };
    

    [EDIT]

    If all your columns are string type, you have to enclosed each of them with their own CONVERTs.

    .Expression = string.Format("CONVERT({0},System.String)", 
    
          "CONVERT(" + serviceTaxClmnInCNote  + ", System.Int32)"
          + " + " 
          + "CONVERT(" + STTClmnInCNote + ", System.Int32)"
    
          );
    

    Just change the System.Int32 to System.Decimal if the serviceTax and STT are money type.