2015-10-14 163 views
0

不知道我在做什麼錯誤,但我有一個循環,應該打印15行到多行文本框,並且它打印10(成千上萬)(確切地說32,767)。我有2個類:我的表單類(DISMgui.cs)和我的邏輯類(DISM.cs)。ForEach循環重複行

表格具有用於文件的文本框(txtWimFile),按鈕(btnMount),背景工人(bwMountWim)和用於輸出的ML文本框(爲txtOutput)。

場景:在txtWimFile(例如C:\ Temp \ Win7x64.wim)中輸入文件的名稱。點擊btnMount。這要求bwMountWim.RunWorkerAsync():

private void btnMount_Click(object sender, EventArgs e) 
{ 
    if (!String.IsNullOrEmpty(txtWimFile.Text)) 
     bwMountWim.RunWorkerAsync(); 
    else 
     MessageBox.Show("WIM file text box returned null!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
} 

這就要求從DISM類(的imageinfo)的方法:

private void bwMountWim_DoWork(object sender, DoWorkEventArgs e) 
{ 
    imageInfo = DISM.ImageInfo(GetTxtWimFile(), this); 
} 

的imageinfo使用DismApi收集WIM映像上的信息,並返回信息:

public static DismImageInfoCollection ImageInfo(string wimFile, DISMgui that) 
{ 
    DismImageInfoCollection info = null; 

    try 
    { 
     info = DismApi.GetImageInfo(wimFile); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString(), "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 

    return info; 
} 

的背景工人RunWorkerCompleted返回信息爲txtOutput.Text:

private void bwMountWim_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    foreach (DismImageInfo info in imageInfo) 
    { 
     Output = ""; 
     Output += "Image information for image " + WimFile + System.Environment.NewLine; 
     Output += System.Environment.NewLine; 
     Output += String.Format("Image index   : {0}" + System.Environment.NewLine, info.ImageIndex.ToString()); 
     Output += String.Format("Image name   : {0}" + System.Environment.NewLine, info.ImageName.ToString()); 
     Output += String.Format("Image Internal Size : {0} MB" + System.Environment.NewLine, (info.ImageSize/1048576).ToString("N0")); 
     Output += String.Format("Image Description : {0}" + System.Environment.NewLine, info.ImageDescription.ToString()); 
     Output += String.Format("Image Type   : {0}" + System.Environment.NewLine, info.ImageType.ToString()); 
     Output += String.Format("Image Installation : {0}" + System.Environment.NewLine, info.InstallationType.ToString()); 
     Output += String.Format("Image Prod Name  : {0}" + System.Environment.NewLine, info.ProductName.ToString()); 
     Output += String.Format("Image Prod Suite : {0}" + System.Environment.NewLine, info.ProductSuite.ToString()); 
     Output += String.Format("Image Prod Type  : {0}" + System.Environment.NewLine, info.ProductType.ToString()); 
     Output += String.Format("Image Prod Version : {0}" + System.Environment.NewLine, info.ProductVersion.ToString()); 
     Output += String.Format("Image Bootable  : {0}" + System.Environment.NewLine, info.Bootable.ToString()); 
     Output += String.Format("Image Architecture : {0}" + System.Environment.NewLine, info.Architecture.ToString()); 
     Output += String.Format("Image Edition ID : {0}" + System.Environment.NewLine, info.EditionId.ToString()); 

    } 

    txtOutput.Text = Output; 
} 

DismApi設置爲能夠處理具有多個索引的WIM,儘管我通常使用的WIM只有一個。

我理解我的邏輯的方式,在「imageInfo」中只應該有一個「info」對象,從而只運行一次循環。但是,我收到了超過30,000行返回的內容(請參閱here,對於pastebin來說太多了)。具有諷刺意味的是,最後15行應該是這樣。

如果有人能說出爲什麼在這個問題上,我能做些什麼來解決它,我會很感激。我有一種感覺,那簡直是愚蠢的。

代碼Output屬性:

public string Output 
{ 
    get { return output; } 
    set 
    { 
     if (!String.IsNullOrEmpty(value)) 
     { 
      output += value; 
     } 
    } 
} 
+5

你有過在調試器的代碼踩看到'imageInfo'項的個數? – Tim

+1

@Tim應該不重要,因爲每個循環在將其他值連接到它之前將'Output'重置爲空字符串。所以,只有來自最終迭代的值纔會被設置爲「textOutput.Text」。 – juharr

+2

什麼是輸出?它是如何定義的? –

回答

2

所以我之所以問Output是我想知道,如果這是一個簡單的字符串或東西里面別的事情上的屬性。你的「二傳手」正在搞砸你。

這是你的財產,從您的評論:

public string Output 
{ 
    get { return output; } 
    set 
    { 
     if (!String.IsNullOrEmpty(value)) 
     { 
      output += value; 
     } 
    } 
} 

首先,您連接到Output這樣。如果它是一個簡單的字符串,一切都很好。

Output += String.Format(...); 

而是由於+=,你基本上是這樣:

Output = Output + String.Format(...); 
     ^^^^^^^^^^^^^^ // all of that is the "value" your passing into the property 

換句話說:

if (!String.IsNullOrEmpty(value)) 
{ 
    // The value of "value" is everything that was in output, 
    // plus the additional string, which gets tacked on to the end of "output" 
    output += value; 
} 

爲了解決這個問題,你一定要重新工程師這個。例如,在屬性設置器中或在foreach循環中刪除+=中的一個。


我想我會用StringBuilder替換屬性:

var output = new StringBuilder(); 
output.AppendLine("Image information for image " + WimFile); 
output.AppendLine(""); 
output.AppendLine(""); 
output.AppendLine(String.Format("Image index   : {0}", info.ImageIndex.ToString())); 
... 
... 
txtOutput.Text = output.ToString(); 
+0

那裏還有其他邏輯也困擾着我。就像事實上你有一個'foreach'循環會清除以前迭代中的所有值,這樣只有最終迭代的值纔會出現在TextBox中。這可能也是需要檢查的,或者如果只有一個值可以迭代,就可以取出循環。 –

+1

我在詛咒自己......我知道這很簡單,但我從來沒有想過檢查Output屬性。由於txtOutput充當日誌,因此我認爲它總是+ =,並且不認爲雙連接甚至會發生。改變我的循環到=已修復問題 – jparnell8839

+0

字符串的清除只是一個快速調試,以確保它不是多次循環(因爲我知道我的WIM只有1個索引)。它已被刪除,但我願意接受其他可能的建議。我仍然在學習C#和麪向對象的一般,並試圖保持良好的形式,而不是養成壞習慣 – jparnell8839