dejf111 Ответов: 1

Как я могу исправить путь для подсчета файлов и каталогов?


редактировать: оригинал сообщения удален
Изменить номер 284 148
Поэтому я переделал его, не знаю, правильно ли это было.Теперь у меня возникли проблемы с подгонкой моих результатов в форму 2.может быть, все это неправильно, и я не получил OriginalGriff статья Передача информации между двумя формами, Часть 1: Родитель-Ребенок[^]
Большое вам спасибо за вашу помощь и терпение OriginalGriff
Теперь у меня возникли проблемы с передачей информации в форму 2

Что я уже пробовал:

Форма 1:
using System;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows.Forms;


namespace pocetadresaru
{
    public partial class Form1 : Form
    {
        private Form2 form2;
        

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            form2 = new Form2();
            form2.FormClosed += new FormClosedEventHandler(form2_FormClosed);
            form2.Location = new Point(Location.X, Location.Y + Height + 80);
            form2.Show();
            textBox1.Focus();
        }

        private void form2_FormClosed(object sender, FormClosedEventArgs e)
        {
            Close();
        }

        private void button1_Click_1(object sender, EventArgs e)

        {
            string folderPath= String.Empty;
            var folder = new FolderBrowserDialog();

            if (folder.ShowDialog() == DialogResult.OK)
            {
                folderPath = Path.GetFullPath(folder.SelectedPath);
                textBox1.Text = folderPath;
            }
        }

        public static int GetDirectoryCount(string folderPath)
        {
            return Directory.EnumerateDirectories(folderPath).Count();
            
          
        }

        public static int GetFileCount(string folderPath)
        {
          return Directory.EnumerateFiles(folderPath).Count();
            
             
        }


    }
}

Форма 2:
using System;
using System.Windows.Forms;

namespace pocetadresaru
{
    public partial class Form2 : Form
    {
        public string Data
        {
            get { return richTextBox1.Text; }
            set { richTextBox1.Text = "Adresář:" + GetDirectoryCount + Environment.NewLine + "Soubor:" + GetFileCount; }
        }
        public Form2()
        {
            InitializeComponent();

        }
    }
}

Richard MacCutchan

Избавьтесь от Form2 и делайте все на Form1. Это будет менее запутанным.

1 Ответов

Рейтинг:
7

OriginalGriff

Вы делаете это очень неправильно: ваша форма 2 не должна знать, что форма 1 вообще существует, но меньше того, какие свойства или поля она имеет.
Как только я увижу ключевые слова public static очевидно, что вы идете неправильно - вам не нужно использовать static переменные в коде настолько просты, и вы не должны создавать поля или элементы управления public вообще!

Начните с чтения этого: Передача информации между двумя формами, Часть 1: Родитель-Ребенок[^]
Форма form1 ваших родителей, форму Form2 вашего ребенка.
Затем создайте свойство в Form2 и установите его при создании экземпляра. Теперь ваши формы "развязаны", поэтому только родитель должен знать что-либо о ребенке.

Тогда исправь свою ошибку. null проблема - и это тоже просто:

FolderPath = Path.GetDirectoryName(folder.SelectedPath);

Path.GetDirectoryName ожидает путь к файлу, а не к папке - и возвращает папку, в которой находится этот файл. Поэтому, когда вы передаете ему папку вместо файла, он "вычеркивает" окончательное имя папки:
C:\docs\today становится C:\docs
C:\docs становится C:
C:\ становится null
То SelectedPath собственность компании FolderBrowserDialog это уже папка, а не файл - вам не нужно получать имя папки из этого!


dejf111

Когда я прочитаю эту статью, могу ли я предложить здесь, как я ее решаю?

OriginalGriff

Помоги себе сам!

dejf111

в переводе на мой язык это означает две вещи и я не знаю какую именно ты имеешь в виду

OriginalGriff

И не имея ни малейшего представления о том, что вы говорите, я тоже не знаю!

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

dejf111

Надеюсь, я вас не расстроил

OriginalGriff

Нет - нет, простите, если я произвел на вас такое впечатление.
Ваш комментарий "Когда я читаю статью, могу ли я предложить здесь, как я ее решаю?" По - английски это звучит так: "Когда я прочитаю статью, могу ли я опубликовать здесь свое решение?" - отсюда и мой ответ.
Если это не то, что вы имели в виду, то, пожалуйста, используйте Google translate, чтобы попытаться объяснить более подробно! :смеяться:

dejf111

твоя статья потрясающая может быть я начинаю понимать ее

OriginalGriff

О, хорошо! :большой палец вверх:

dejf111

Я попытался переписать его в соответствии со статьей

OriginalGriff

И что же? Что случилось?

dejf111

две вещи не работают для меня, одна сдвигает form2, а другая close() не закрыла ни одного моего окна

OriginalGriff

"одна изменяющаяся форма2"
"close() не закрыл ни одного моего окна"

Они не имеют никакого смысла для меня в изоляции ...
Помните, что мы не можем видеть ваш экран, получить доступ к вашему жесткому диску или прочитать ваши мысли - мы получаем только то, что вы печатаете для работы. Поэтому, если вы пишете код, который не работает, мы не можем сказать, что именно вы написали, пока вы не покажете его нам!

dejf111

возможно, я смогу объяснить это подробнее
частная form2_FormClosed недействительным(объект отправителя, FormClosedEventArgs е)
{
Закрывать();
}
записывает ошибку StackOverflowException и ни одно окно не закрывается


form2.Location = новая точка( Location.X,Местоположение.Y+Высота+30);
Я полагаю, что он должен переместить второе окно под главное окно, меня просто перекрывают

OriginalGriff

"Пишет исключение переполнения стека" - это показывает, что вы просто догадывались, что делать! :смеяться:

Происходит то, что вы обрабатываете событие FormClosed для Form2 в Form2 и закрываете форму в этом случае. Это приводит к тому, что система снова вызывает обработчик FormClosing, который закрывает форму, которая вызывает обработчик, который ... до тех пор, пока стек не заполнится и приложение не выйдет из строя с исключением переполнения стека.
Как вы думаете, почему вам нужно закрыть форму в обработчике close для нее?

Вернитесь к статье и перечитайте ее еще раз - обратите внимание на то, что и где нужно обрабатывать!

dejf111

о'кей, я собираюсь прочитать его еще раз :D

dejf111

Я читаю столько, сколько могу, и все еще не вижу ошибки.

OriginalGriff

Как выглядит ваш код в данный момент?
То, что показывает вам отладчик, происходит - вы использовали отладчик, не так ли?

dejf111

с отладчиком я не очень хороший друг как и со всем остальным

OriginalGriff

Познакомьтесь с отладчиком - это лучший инструмент, который у вас есть, и вы будете тратить на него больше времени, чем на написание кода!
Это может сэкономить Вам дни, даже недели поиска неисправностей.

dejf111

Так лучше?

OriginalGriff

Зачем ты это делаешь?

        public static int GetDirectoryCount()
        {
            var directoryCount = 0;
            var directoryIter = Directory.EnumerateDirectories(folderPath);
            foreach (var directory in directoryIter)
                directoryCount++;
            return directoryCount;
        }

Когда вы могли бы просто сделать это:
        public static int GetDirectoryCount()
        {        
return Directory.EnumerateDirectories(folderPath).Count();
        }

dejf111

Я не знаю почему но я думал что циклы должны быть использованы

OriginalGriff

И почему вы используете статическую переменную для передачи пути, вместо этого используйте параметр:

public static int GetDirectoryCount(string folderPath)
...

dejf111

вы можете быть счастливы за меня, но я наконец-то получил его работу :) :D

OriginalGriff

Ура! Молодец! :большой палец вверх:

dejf111

Еще один вопрос: возможно ли, что он просчитывается?

OriginalGriff

:смеяться:
Откуда мне знать? У меня нет доступа к вашему коду или вашей системе, поэтому я не могу сказать отсюда!

Что вы сделали, чтобы проверить это, и почему вы думаете, что это неправильно?

dejf111

Я спросил мнение более опытного человека, если он сталкивался с этим :)
некоторые каталоги он считает хорошо, документы все хорошо, но я не знаю, как это возможно

OriginalGriff

Не зная, для каких каталогов он работает, а для каких нет, я ничем не могу помочь!
В качестве предложения попробуйте добавить файл журнала в свой код, чтобы он записывал каждую папку, которую он пробует, и сколько он нашел - после этого вы можете проверить вручную и проверить количество. Любые расхождения, и вы можете начать искать, почему они отличаются - но если у вас нет конкретной информации, вы просто свистите в темноте ...

dejf111

хммм я попробую что нибудь сделать

dejf111

Цель достигнута, для меня большая работа.
Большое вам спасибо!

OriginalGriff

Всегда пожалуйста!

dejf111

в этот момент я думаю о том, как я собираюсь прикрепить индивидуальный подсчет

dejf111

В свою защиту скажу, что это была не моя вина, я запустил новый файл проекта, и он уже работал :D

BillWoodruff

+5 Между нами двумя, он может что-то сделать:

https://www.codeproject.com/Answers/5282505/How-to-load-text-in-richtext-box