2015-10-19 129 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; 

否则,文本的可视空间被缩短。在这种情况下,留下部分路径。恰巧碰巧与另一条有效路径相同。