Применение foreach в строках gridview, похоже, не работает - PullRequest
2 голосов
/ 26 февраля 2010

У меня есть gridview, и я преобразую строки gridview в данные ... Но я не могу получить значение скрытого поля в ячейке [0] внутри gridview ....

    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);
    }

Я получил ошибку в строке,

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

Input String was not in a correct format

Примечание:

Cells[0] - это скрытое поле, содержащее 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>

Моя сетка, alt text

Ответы [ 2 ]

8 голосов
/ 26 февраля 2010

Вам нужно добавить условие, чтобы убедиться, что вы не анализируете верхний и нижний колонтитулы:

РЕДАКТИРОВАТЬ: Рабочий результат (оставляя другой, потому что это может также относиться к аналогичным ситуациям

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);
}  

РЕДАКТИРОВАТЬ: Поскольку у меня нет студии на это, чтобы исправить себя

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);
    }
}  
2 голосов
/ 26 февраля 2010

Эта ошибка означает, что cells[0].Text не содержит числа.

Проверьте значение row.Cells[0].Text в отладчике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...