Невозможно преобразовать строку в DataTable в C # - PullRequest
1 голос
/ 01 октября 2011

Я пытаюсь преобразовать DataRow в DataTable, но я получаю ошибки. Я искал и пробовал все возможные решения, но ни одно не помогло!

У меня есть метод, который принимает DataTable в качестве параметра (у этого DataTable точно одна строка). Этот метод вернет некоторую информацию.

Сначала я попытался преобразовать DataRow в DataTable, используя ImportRow(newtable.ImportRow(row)), но впоследствии newtable пусто. Затем я попробовал dt.clone(), но это наполняет newtable только всем, что было не тем, что я делал! На самом деле именно то, что я хотел после.

private static void BatchFrontSidePrinting(Student St, frmBaseCard frm)
{
    DBINFOPACK UserInfo;
    DBCARDINFO CardInfo;
    DataTable newtable = new DataTable("newtable");

    foreach (DataRow row in dt.Rows)
    {
        try
        {

            // here, I'm trying to send one DataRow as a DataTable to the GetInfo() method,
            // and for the next iteratio , after getting the info I'm removing the row which was just added,
            // so that for the next iteration, newdatatable is empty.  All of the proceeding actions fail !:( 

            newtable.ImportRow(row); // doesn't work! 

            UserInfo = GetInfo(newtable);

            newtable.Rows.Remove(row); // doesn't work! 

            St = UserInfo.STUDENT;

            ((frmFrontSideCard)frm).Replica = UserInfo.CARDINFO.Replica;

            if (UserInfo.CARDINFO.Replica)
            {
                Loger.Items.Add("Replication !");
            }

            // print
            ((frmFrontSideCard)frm).Print = St;

            // update
            CardInfo = UserInfo.CARDINFO;
            CardInfo.SID = UserInfo.STUDENT.ID;
            CardInfo.BIMAGE = UserInfo.BIMAGE;
            SetInfo(CardInfo);
        }
        catch (Exception exep)
        {
            Loger.Items.Add(String.Format("Inside [BatchFrontSidePrinting()] : Student {0} {1}:", St.ID, exep.Message));
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 01 октября 2011
foreach (DataRow row in dt.Rows)
{
    try
    {
        DataTable newtable = new DataTable();
        newtable = dt.Clone(); // Use Clone method to copy the table structure (Schema).
        newtable.ImportRow(row); // Use the ImportRow method to copy from dt table to its clone.
        UserInfo = GetInfo(newtable);

    catch (Exception exep)
    {
        //
    }
}
1 голос
/ 01 октября 2011

Похоже, вы используете newtable в качестве временного контейнера для отправки каждой строки в dt методу GetInfo.Если так, то почему бы не изменить метод GetInfo, чтобы взять DataRow вместо DataTable, который содержит один DataRow?Тогда вы можете избавиться от newtable и вообще не беспокоиться о создании и копировании DataRow s.

private static void BatchFrontSidePrinting(Student St, frmBaseCard frm) 
{ 
    DBINFOPACK UserInfo ; 
    DBCARDINFO CardInfo; 

    foreach (DataRow row in dt.Rows) 
    { 
        try 
        {       
            // just pass the row
            UserInfo = GetInfo(row); 

            // rest of the code as before
            St = UserInfo.STUDENT; 
            ((frmFrontSideCard)frm).Replica = UserInfo.CARDINFO.Replica; 
            if (UserInfo.CARDINFO.Replica) 
            { 
                Loger.Items.Add("Replication !"); 
            } 
            //print 
            ((frmFrontSideCard)frm).Print = St; 
            //update 
            CardInfo = UserInfo.CARDINFO; 
            CardInfo.SID = UserInfo.STUDENT.ID; 
            CardInfo.BIMAGE = UserInfo.BIMAGE; 
            SetInfo(CardInfo); 
        } 
        catch (Exception exep) 
        { 
            Loger.Items.Add(String.Format("Inside [BatchFrontSidePrinting()] : Student {0} {1}:", St.ID, exep.Message)); 
        } 
1 голос
/ 01 октября 2011
var someRow = newTable.NewRow();
someRow[0] = row[0]; // etc
newTable.Rows.Add(someRow);
...