2010-02-26 6 views
2

J'ai un gridview et je convertis des lignes de gridview en datatable ... Mais je ne peux pas obtenir la valeur d'un champ caché dans la cellule [0] dans le gridview. ...Appliquer foreach dans les lignes gridview ne semble pas fonctionner

DataTable dt = new DataTable(); 
    dt.Columns.Add(new DataColumn("EmpId", typeof(Int64))); 
    dt.Columns.Add(new DataColumn("FromDate", typeof(DateTime))); 
    dt.Columns.Add(new DataColumn("ToDate", typeof(DateTime))); 
    dt.Columns.Add(new DataColumn("DaysPresent", typeof(decimal))); 
    dt.Columns.Add(new DataColumn("OpeningAdvance", typeof(double))); 
    dt.Columns.Add(new DataColumn("AdvanceDeducted", typeof(double))); 
    dt.Columns.Add(new DataColumn("RemainingAdvance", typeof(double))); 
    dt.Columns.Add(new DataColumn("SalaryGiven", typeof(double))); 
    dt.Columns.Add(new DataColumn("CreatedDate", typeof(DateTime))); 

    foreach (GridViewRow row in gridEmployee.Rows) 
    { 
     DataRow dr = dt.NewRow(); 
     dr["EmpId"] = Convert.ToInt64(row.Cells[0].Text); 
     dr["FromDate"] = Convert.ToDateTime(GetMonthNumberFromAbbreviation(fromdate[1].ToString()) + '/' + fromdate[0].ToString() + '/' + fromdate[2].ToString()); 
     dr["ToDate"] = Convert.ToDateTime(GetMonthNumberFromAbbreviation(todate[1].ToString()) + '/' + todate[0].ToString() + '/' + todate[2].ToString()); 
     dr["DaysPresent"] = Convert.ToDecimal(row.Cells[4].Text); 
     dr["OpeningAdvance"] = Convert.ToDouble(row.Cells[5].Text); 
     dr["AdvanceDeducted"] = Convert.ToDouble(row.Cells[6].Text); 
     dr["RemainingAdvance"] = Convert.ToDouble(row.Cells[7].Text); 
     dr["SalaryGiven"] = Convert.ToDouble(row.Cells[8].Text); 
     dr["CreatedDate"] = Convert.ToDateTime(System.DateTime.Now.ToString()); 
     dt.Rows.Add(dr); 
    } 

Je suis l'erreur dans la ligne,

dr["EmpId"] = Convert.ToInt64(row.Cells[0].Text);

Input String was not in a correct format

note:

Cells[0] est un HiddenField qui contient EMPID ....

<asp:TemplateField > 
    <HeaderStyle Width="1%" /> 
    <HeaderTemplate> 
    </HeaderTemplate> 
    <ItemTemplate> 
    <asp:HiddenField ID="HiddenId" runat="server" value='<%#Eval("Emp_Id") %>' /> 
    <asp:Label ID="LblHiddenId" runat="server" Text='<%#Eval("Emp_Id") %>'></asp:Label> 
    </ItemTemplate> 
    <ItemStyle Width="1%" CssClass="GridCs" HorizontalAlign="Left" /> 
    </asp:TemplateField> 

Mon gridview, alt text http://img109.imageshack.us/img109/6804/gridnewcopy.jpg

+0

pour 'CreatedDate', vous pouvez simplement écrire' dr [ "CreatedDate"] = DateTime.Now' – SLaks

+0

@Slaks ok .. . Mais Je ne peux pas obtenir la valeur du champ caché ... Mais quand j'ai utilisé une étiquette à la place j'ai eu la valeur –

Répondre

8

Vous devez ajouter une condition pour vous assurer que vous n'êtes pas l'en-tête et l'analyse syntaxique du pied de page:

EDIT: Résultat de travail (en laissant l'autre parce qu'il peut également appliquer à des situations similaires

foreach (GridViewRow row in gridEmployee.Rows) 
{ 
    DataRow dr = dt.NewRow(); 
    dr["EmpId"] = Convert.ToInt64(((Label)cells[0].FindControl("LblHiddenId")).Text); 
    dr["FromDate"] = Convert.ToDateTime(GetMonthNumberFromAbbreviation(fromdate[1].ToString()) + '/' + fromdate[0].ToString() + '/' + fromdate[2].ToString()); 
    dr["ToDate"] = Convert.ToDateTime(GetMonthNumberFromAbbreviation(todate[1].ToString()) + '/' + todate[0].ToString() + '/' + todate[2].ToString()); 
    dr["DaysPresent"] = Convert.ToDecimal(row.Cells[4].Text); 
    dr["OpeningAdvance"] = Convert.ToDouble(row.Cells[5].Text); 
    dr["AdvanceDeducted"] = Convert.ToDouble(row.Cells[6].Text); 
    dr["RemainingAdvance"] = Convert.ToDouble(row.Cells[7].Text); 
    dr["SalaryGiven"] = Convert.ToDouble(row.Cells[8].Text); 
    dr["CreatedDate"] = Convert.ToDateTime(System.DateTime.Now.ToString()); 
    dt.Rows.Add(dr); 
} 

EDIT:. Depuis que je ne suis pas en studio sur ce à me corriger

foreach (GridViewRow row in gridEmployee.Rows) 
{ 
    if(row.RowType == DataControlRowType.DataRow) 
    { 
     DataRow dr = dt.NewRow(); 
     dr["EmpId"] = Convert.ToInt64(row.Cells[0].Text); 
     dr["FromDate"] = Convert.ToDateTime(GetMonthNumberFromAbbreviation(fromdate[1].ToString()) + '/' + fromdate[0].ToString() + '/' + fromdate[2].ToString()); 
     dr["ToDate"] = Convert.ToDateTime(GetMonthNumberFromAbbreviation(todate[1].ToString()) + '/' + todate[0].ToString() + '/' + todate[2].ToString()); 
     dr["DaysPresent"] = Convert.ToDecimal(row.Cells[4].Text); 
     dr["OpeningAdvance"] = Convert.ToDouble(row.Cells[5].Text); 
     dr["AdvanceDeducted"] = Convert.ToDouble(row.Cells[6].Text); 
     dr["RemainingAdvance"] = Convert.ToDouble(row.Cells[7].Text); 
     dr["SalaryGiven"] = Convert.ToDouble(row.Cells[8].Text); 
     dr["CreatedDate"] = Convert.ToDateTime(System.DateTime.Now.ToString()); 
     dt.Rows.Add(dr); 
    } 
} 
+0

@joel regarde mon image je suis en boucle à travers mes lignes gridview dans un clic de bouton et pas dans un événement gridview ... –

+0

@Pandiya: c'était juste une pâte d'un événement en ligne. Laissez-moi éditer pour votre exemple EXACT. –

+0

@Joel ok aller de l'avant .... –

2

Cette erreur signifie que cells[0].Text ne contient pas de numéro.

Vérifiez la valeur de row.Cells[0].Text dans le débogueur.

+0

@Slaks il montre '" "' –

+0

@SLaks regarde ma photo éditée ... –

Questions connexes