Я работаю с простой программой, которая, по сути, предназначена для цифровых карт памяти. В идеале я хочу, чтобы программа была переносной. Я пытаюсь получить текущий каталог. Моя настройка такова:Получение текущего каталога
У меня есть метод 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 был отключен.
Я чувствую себя ... довольно глупым в этот конкретный момент. Спасибо за помощь!
Вы проверили, не используется ли текст радиотекста каким-либо другим элементом управления? Щелкните правой кнопкой мыши в браузере и проверьте элемент, чтобы увидеть, какой текст действительно отображается для переключателя. –
Просто убедитесь, что происходит, когда вы заменяете 'FileIO.pathPortable + @" \ Data ";' с 'FileIO.pathPortable'; ? – Rob
@Rob - Я сделал настройку, и программа по-прежнему имеет тот же конечный результат. Сообщения на этом пути показывают информацию в новой (выше) папке. Внутри папки Debug находится только папка «Данные» (где выполняется активное отладочное приложение). – Branden