2015-10-19 4 views
0

Я работаю с простой программой, которая, по сути, предназначена для цифровых карт памяти. В идеале я хочу, чтобы программа была переносной. Я пытаюсь получить текущий каталог. Моя настройка такова:Получение текущего каталога

У меня есть метод FileIO.cs, который считывает currentDir/Data. Затем у меня есть winform, который вызывает метод и извлекает массив [] из списка папок. Оба эти метода являются общедоступными. Затем у меня есть отдельная кнопка для создания элементов управления в форме.

Проблема: Я очистил/восстановил решение и использовал отладчик; Программа запускается из C: \ Users \ user \ a \ b \ c \ solution \ bin \ debug. Элемент управления (radioButton), который я создал для проверки этих данных, сообщает мне, что «currentDir» - это C: \ Users \ user, а не текущий каталог программ.

Примечания: Я вручную создал Debug \ Data и 4 папки в папке с данными, поэтому я на 100% уверен, что они существуют. Никаких предупреждений или ошибок компиляции или времени выполнения не выбрасывается. Card_Base.GetGrades автоматически вызывается при загрузке формы.

Я также подтвердил, что папка выпуска пуста и не используется. Кроме того, у меня есть программа резервного копирования, которая показывает значок, когда файл загружается в мою резервную копию при каждом изменении файла (ов). Таким образом, я уверен, что bin \ debug - это правильная рабочая папка в этом сценарии.

Возможно, меня больше всего озадачивает то, что у меня есть совершенно отдельная программа, написанная на том же ПК с использованием той же IDE, и она правильно извлекает путь, используя ту же настройку.

В 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: \ Users \ User, а не папку Bin \ 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! 
    } 

Результат: ??? Четыре вертикально выровненные Radiobuttons на форме панели, которые все имеют текст для чтения «C: \ Users \ Пользователь \»

Update1: Текст также появляется немного криво, немного выше, чем сама RadioButton пузырь, очень странно. Тем не менее, я вернулся в редактор и подтвердил, что панельGear изначально пуста. Щелчок/перетаскивание не захватывает ничего, и щелчок правой кнопкой мыши на панели не показывает никаких базовых объектов в пространстве панели.

После изменения целевого каталога его родительскому объекту (на 1 уровне выше) каждая контрольная точка messageBox обнаруживает, что отправляется соответствующая строка/путь. Видимая радиостанция, когда программа запускается, после нажатия кнопки «тест» единственное появление этого необычного текста/строки, появляющееся где угодно.

Размещение сообщенийBoxes до/после цикла внутри самой тестовой кнопки показывает, что элемент управления (radioButton in buttonGrade [0]) содержит правильную строку/текст/путь. Таким образом, изменение должно произойти в какой-то момент после завершения кода buttonTest.

Update2: Я только что открыл совершенно новое решение и копировал/вставлял соответствующий код, устраняя что-либо постороннее. Именован все элементы/элементы управления с одинаковыми именами. Полностью голые кости. Точная же проблема.

ОДНАКО, когда я меняю radioButtons на TextBoxs ... программа отображает правильную информацию. Um. Какие???

Обновление 3: Просмотр радиостанций MSDN происходит от buttonBase. Единственное релевантное событие, которое я вижу с первого взгляда, - это событие textChanged. Хотя он отмечает, что способ, которым обладает текстовое свойство производных классов, таких как radioButton, не позволяет точно определить, как и какие ограничения он имеет. Control.Text - это просто System.String, поэтому я не вижу причин, по которым radioButton не сможет содержать эту информацию.

Я попытался создать кнопку 'test2' для изменения 'buttonGrade [0] .Text = FileIO.pathPortable;' , Как ни странно, он не меняет весь текст. И это не вызывает ошибки.

AH HA! Я заметил, что папка за пользователем была моим Google Drive, который является «Google Диском» и имеет место в нем. Затем я скопировал свою программу мусора в C: \ и назвал ее TrashMe2 и не содержал никаких имен папок, содержащих пробелы. Результатом было «C: \ TrashMe2 \ bi». Затем я попробовал «123456789». В результате оказалось, что он появился со вторым. 3.

РадиоБаттон не получал другую строку, и строка/путь/данные никогда не менялись. Он просто показал «другую папку», потому что, к счастью, ничья, было точное количество видимых символов, которые она показывала. Поскольку я создал программные средства radioButtons, AutoSize не использовал значение по умолчанию true. Правильная строка была частью radioButton, она просто не была видна.

И по соображениям безопасности (и немного юмора), я фактически называю свою учетную запись «пользователем». Так что это был не сценарий, где я бы увидел C: \ Users \ JoeNomidBlow был отключен.

Я чувствую себя ... довольно глупым в этот конкретный момент. Спасибо за помощь!

+0

Вы проверили, не используется ли текст радиотекста каким-либо другим элементом управления? Щелкните правой кнопкой мыши в браузере и проверьте элемент, чтобы увидеть, какой текст действительно отображается для переключателя. –

+0

Просто убедитесь, что происходит, когда вы заменяете 'FileIO.pathPortable + @" \ Data ";' с 'FileIO.pathPortable'; ? – Rob

+0

@Rob - Я сделал настройку, и программа по-прежнему имеет тот же конечный результат. Сообщения на этом пути показывают информацию в новой (выше) папке. Внутри папки Debug находится только папка «Данные» (где выполняется активное отладочное приложение). – Branden

ответ

0

Программируемое добавление элемента управления, в частности radioButton, автоматически не устанавливает для свойства autoSize значение true. При создании RadioButton программно, один должен быть уверен, чтобы добавить

radioButton.Autosize = true; 

или как этот случай/был

buttonGrade[i].Autosize = true; 

В противном случае видимое пространство текста сокращается. В этом случае, оставив частичный путь. Кажется, что совпадение идентично другому действительному пути.

Смежные вопросы