2015-10-19 220 views
0

我一直在使用一個基本上設計爲數字閃存卡的簡單程序。理想情況下,我希望程序是可移植的。我正在嘗試獲取當前目錄。我的設置是這樣的:獲取當前目錄

我有一個FileIO.cs方法讀取currentDir /數據。然後我有一個winform,它調用該方法並檢索文件夾列表的字符串[]數組。這兩種方法都是公共靜態的。然後我有一個單獨的按鈕來在窗體上創建控件。

問題: 我已清洗/重建所述溶液,並使用調試器被;該程序從C:\ Users \ user \ a \ b \ c \ solution \ bin \ debug運行。我爲驗證此數據而創建的控件(radioButton)告訴我'currentDir'是C:\ Users \ user,而不是程序當前目錄。

注: 我手動創建調試\數據和數據文件夾內的4個文件夾,所以我敢肯定他們的存在100%。不會引發警告或編譯或運行時錯誤。 Card_Base.GetGrades會自動在表單加載時成功調用。

我也確認發佈文件夾是空的並且未被使用。此外,我還有一個備份程序,當文件每次更改時都會上傳到備份中,並顯示一個圖標。所以我100%確定bin \ debug是這種情況下正確的工作文件夾。

也許什麼是最令人費解的是,我已經寫了使用相同的IDE在同一臺PC上的一個完全獨立的程序,它正確地檢索使用相同的設置路徑。

在FileIO.cs

//public static string pathPortable = System.IO.Directory.GetCurrentDirectory(); 

     public static string pathPortable = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 

static string[] grade1; 

    public static string[] GetGrade() 
    { 
     string fullPath = FileIO.pathPortable + @"\Data"; 
     grade1 = Directory.GetDirectories(fullPath); 

     return grade1; 
    } 

在Card_Base.cs

public static List<RadioButton> buttonGrade = new List<RadioButton>(10); 
    public static void GetGrades() 
    { 
     string[] grade2 = FileIO.GetGrade(); 
     //Proper and accurate names of the folders I manually added 
     //C:\Users\user\a\b\c\solution\bin\debug\Data\K 
     //C:\Users\user\a\b\c\solution\bin\debug\Data\1 
     //C:\Users\user\a\b\c\solution\bin\debug\Data\2 
     //C:\Users\user\a\b\c\solution\bin\debug\Data\3 


     MessageBox.Show("" + grade2[0]); //Information (entire path) is accurate as of this line 

     int x = 5; 
     int y = 0; 

     for (int i = 0; i < grade2.Count(); i++) 
     { 
      y = i * 21; 
      Card_Base.buttonGrade.Add(new RadioButton()); 
      Card_Base.buttonGrade[i].Text = grade2[i]; 
      MessageBox.Show("" + buttonGrade[i].Text); //Proper entire path is shown here! 
      Card_Base.buttonGrade[i].Location = new System.Drawing.Point(x, y); 

     } 
    } 

控制其的.text屬性其示出了C:\用戶\用戶,而不是賓\ Debug文件夾。

 private void buttonTest_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("abc:" + buttonGrade[0].Text); 

     for (int i = 0; i < buttonGrade.Count(); i++) 
     { 
      panelGrade.Controls.Add(buttonGrade[i]); 
     } 

     MessageBox.Show("def:" + buttonGrade[0].Text); //Proper string path is displayed in the popup box here! 
    } 

結果:??? 四形式面板上垂直排列單選按鈕,所有有文本閱讀「C:\用戶\用戶\」

UPDATE1: 文本也會出現稍微錯位,比RADIOBUTTON氣泡本身略高,很奇怪。但是,我已經回到編輯並確認panelGrade最初是空的。單擊/拖動不捕捉任何東西,並右鍵單擊面板不會在面板空間中顯示任何基礎對象。

將目標目錄修改爲其父級(高1級)後,每個messageBox檢查點顯示正在發送正確的字符串/路徑。當「test」按鈕被按下後,程序啓動時的可見radioButton是這種不尋常的文字/字符串出現在任何地方的唯一情況。前

配售消息框/後測試按鈕自身內的循環示出了控制(單選按鈕在buttonGrade [0])DOES包含正確的串/文本/路徑。因此,改變必須發生在buttonTest代碼完成執行後的某個時間點。

UPDATE2: 我剛開了一個全新的解決方案和複製/粘貼相關代碼消除任何多餘的。將所有的項目/控件命名爲相同的名稱。完全裸露的骨頭。完全相同的問題。

但是,當我將radioButtons更改爲TextBox時...程序顯示正確的信息。嗯。什麼???

更新3: 尋找通過MSDN radioButtons派生自buttonBase。我一眼看到的唯一相關事件就是textChanged事件。雖然它注意到,像radioButton這樣的派生類的文本屬性的方式會有所不同,但它無法精確地指定它具有的限制或限制。 Control.Text只是一個System.String,因此我看不出爲什麼radioButton將無法包含這些信息。我試着創建'test2'按鈕來改變'buttonGrade [0] .Text = FileIO.pathPortable;' 。奇怪的是,它並沒有改變文字。它也不會拋出錯誤。

啊哈!我注意到用戶之後的文件夾是我的谷歌驅動器,它是「谷歌驅動器」,並有一個空間。然後,我將垃圾程序複製到C:\並將其命名爲TrashMe2,並確保沒有包含空格的文件夾名稱。結果是「C:\ TrashMe2 \ bi」。然後我嘗試了「123456789」。結果是它顯示到第二秒。

radioButton沒有接收到不同的字符串,字符串/路徑/數據從未改變。它只是顯示了一個'不同的文件夾',因爲那個'通過運氣'是它顯示的可見字符的確切數量。因爲我以編程方式創建了radioButton,所以AutoSize沒有默認爲true。正確的字符串是radioButton的一部分,它不是全部可見的。

而出於安全原因(和一些幽默),我實際上打電話給我的用戶帳戶「用戶」。所以這不是我會看到C:\ Users \ JoeNomidBlow被切斷的場景。

我覺得......在這個特定的時刻很愚蠢。謝謝您的幫助!

+0

您是否檢查單選按鈕文本是否未被其他控件佔用?在瀏覽器中單擊鼠標右鍵,然後檢查元素以查看實際呈現給單選按鈕的文本。 –

+0

可以肯定的是,當你用'FileIO.pathPortable'替換'FileIO.pathPortable + @「\ Data」;'時會發生什麼? ? – Rob

+0

@Rob - 我做了調整,程序仍然有相同的最終結果。沿途的消息框正確顯示新(較高位置)文件夾中的信息。在正在搜索的Debug文件夾內只有一個「Data」文件夾(正在運行主動調試的應用程序)。 – Branden

回答

0

以編程方式添加控件,特別是radioButton,不會自動將autoSize屬性設置爲true。當編程創建一個單選按鈕,一個必須確保添加

radioButton.Autosize = true; 

或這種情況下是/是

buttonGrade[i].Autosize = true; 

否則,文本的可視空間被縮短。在這種情況下,留下部分路徑。恰巧碰巧與另一條有效路徑相同。