2016-04-16 16 views
0

Ich habe eine Klasse Sprachen, in der ich die Excellibrary verwenden. Ich habe eine .xls-Datei, in der ich drei Spalten habe. Die erste wird verwendet, um zu prüfen, ob die Schlüsselphrase im Dokument verwendet wird, und dann habe ich eine Spalte für jede Sprache, die ich verwende. Ich möchte ein transactionField-Objekt für jede Zeile des Dokuments erstellen. Ich versuche das zu tun, aber jedes Mal, wenn ich ein neues Objekt erstelle, nehmen alle Objekte, die zuvor erstellt wurden, die Werte des zuletzt erstellten Objekts an. Kannst du mir bitte erklären, wo ich falsch liege und wie kann ich dieses Problem korrigieren? Diese ist, wo der Fehler passierenAktualisieren Sie alle Objekte, wo neue erstellen

TranslationField tnf = new TranslationField(); 
        tnf.Used = false; 
        tnf.Strings = values; 
        Translations.Add(sKey, tnf); 

    public class Languages 
    { 
    public static bool Setup() 
     { 
     SupportedLanguages.Clear(); 
     SupportedLanguages.Add(csDefaultLang); 

     try 
     { 
      Workbook book = Workbook.Load(sPath); 
      Worksheet sheet = book.Worksheets[0]; 

      KeyStringHelper values = new KeyStringHelper(); 
      TranslationNeedle tnl; 
      List<string> columns = new List<string>(); 
      string sKey = ""; 

      // traverse rows by Index 
      for (int rowIndex = sheet.Cells.FirstRowIndex; rowIndex <= sheet.Cells.LastRowIndex; rowIndex++) 
      { 
       Row row = sheet.Cells.GetRow(rowIndex); 
       row.FirstColIndex = 1; 

       for (int colIndex = row.FirstColIndex; colIndex <= row.LastColIndex; colIndex++) 
       { 
        Cell cell = row.GetCell(colIndex); 

        // the first excel row is assumed to be columns names 
        if (rowIndex == sheet.Cells.FirstRowIndex) 
        { 
         //Columns names correctly formatted 
         columns.Add(char.ToUpper(cell.StringValue[0]) + cell.StringValue.Substring(1).ToUpper()); 
         //Register every language inside the xls 
         SupportedLanguages.Add(char.ToUpper(cell.StringValue[0]) + cell.StringValue.Substring(1).ToUpper()); 
        } 
        else 
        { 
         if (colIndex - row.FirstColIndex == 0) 
          sKey = cell.StringValue.Replace("\r\n", "\n"); 
         else 
          values.Add(columns[colIndex - row.FirstColIndex], cell.StringValue.Replace("\r\n", "\n")); 
        } 
       } 

       // add the cell values to Translations Dictionary 
       if (rowIndex != sheet.Cells.FirstRowIndex) 
       { 
        TranslationField tnf = new TranslationField(); 
        tnf.Used = false; 
        tnf.Strings = values; 
        Translations.Add(sKey, tnf); 
       } 
       } 

      //other stuff 
     } 
     } 

Hier ist die Klasse TranslationField

class TranslationField 
{ 
public bool Used = false; 
public KeyStringHelper Strings = new KeyStringHelper(); 
} 
+1

Bitte reproduzieren Sie dies als [MCVE]. Beachten Sie, dass Sie Ihre "TranslationField" -Klasse nicht angezeigt haben, wo sich das Problem wahrscheinlich befindet. –

+0

Entschuldigung, bearbeiten Sie die Antwort –

+0

Können Sie uns sagen, was Sie bisher versucht haben? Aufgrund Ihres Codes sehe ich nicht, wo der Code falsch läuft. Lassen Sie uns wissen, wo der Code schief läuft, das funktioniert besser in StackOverflow, als zu fragen, "wie löse ich diese funktionale Anforderung?" ... und Ihre Frage klingt für Letzteres viel näher als die erste, fürchte ich . – code4life

Antwort

1

Sie Wiederverwendung der gleichen KeyStringHelper Instanz (values) für jeden TranslationField. So referenziert jede TranslationField Instanz in Ihrer Translations Sammlung dieselbe KeyStringHelper Instanz.

Es sieht aus wie Sie die Linie

KeyStringHelper values = new KeyStringHelper(); 

innerhalb der äußeren for Schleife bewegen müssen.

Verwandte Themen