Как передать строковый параметр метода из одного класса в другой класс в том же пространстве имен? - PullRequest
0 голосов
/ 03 марта 2009

Маленький глупый вопрос, но застрял надолго. Я написал два класса, один из которых является формой (класс TreeDisplay), а другой - логикой бизнеса (класс MyTreeNode). Класс TreeDisplay содержит кнопку обзора, чтобы выбрать файл, передать его в метод initiatingTree (string filename) , который находится в классе MyTreeNode.
Теперь я должен передать имя этого строкового параметра в класс MyTreeNode. Когда я запускаю свой код, выбранный мной XML-файл отображается в текстовом поле, но не в виде дерева.
Я написал часть кода, но он выбрасывает исключение NullReferenceException (ссылка на объект не установлена ​​на экземпляр объекта). Когда весь код был написан в Form.cs, код работал успешно, но при разделении бизнес-логики произошло исключение. Подскажите, пожалуйста, где я не прав?

Это код в кнопке «Обзор» класса TreeDisplay (моя основная форма):

if (open.ShowDialog(this) == DialogResult.OK)
        {
            txtFileName.Text = open.FileName;
            MytreeNodeClass treenodeClass = new MytreeNodeClass();
            treenodeClass.initiatingTree(open.FileName,treeView1); 
        }

Вот код initiatingTree () в моем классе MyTreeNode:

public class MytreeNodeClass
{

    private readonly System.Windows.Forms.TextBox txtFileName;
    private TreeView treeView1;
    private readonly ToolStripStatusLabel toolStripStatusLabel1;

   public string Filename
    {
        get { return filename; }
    }
    protected string filename;

    public MytreeNodeClass()
    {
    }

    public void initiatingTree(string nameofFile,TreeView treeView1)
    {
        try
        {
            //Create XML document & load the XML file.
            XmlDocument xmlDocument = new XmlDocument();
            xmlDocument.Load(nameofFile);
            treeView1 = new System.Windows.Forms.TreeView();
            treeView1.Nodes.Clear();

            if (xmlDocument.DocumentElement != null)
            {
                TreeNode treeNodedoc = new TreeNode(xmlDocument.DocumentElement.Name);

                treeView1.Nodes.Add(treeNodedoc);
            }

При использовании точки останова treeView1.Nodes.Clear () код выходит из этой строки и входит в блок catch, выдавая исключение NullReferenceException.

Пожалуйста, помогите найти основную причину исключения. Спасибо.

Ответы [ 4 ]

5 голосов
/ 03 марта 2009

Каково значение treeView1 на вашей точке останова?

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


Обновлено с примером кода:

public void initiatingTree(string nameofFile, TreeView treeView1)
{
    try
    {
        //Create XML document & load the XML file.
        XmlDocument xmlDocument = new XmlDocument();
        xmlDocument.Load(nameofFile);

        treeView1.Nodes.Clear();

        if (xmlDocument.DocumentElement != null)
        {
            TreeNode treeNodedoc = new TreeNode(xmlDocument.DocumentElement.Name);

            treeView1.Nodes.Add(treeNodedoc);
        }
    }
}

и где вы это называете:

if (open.ShowDialog(this) == DialogResult.OK)
{
    txtFileName.Text = open.FileName;
    MytreeNodeClass treenodeClass = new MytreeNodeClass();
    treenodeClass.initiatingTree(open.FileName, treeView1); 
}
1 голос
/ 03 марта 2009

Как сказал Ц.К.

У вас нет доступа к пользовательским элементам управления из вашего бизнес-уровня в качестве стандарта. Могу ли я предложить вам оставить свой управляющий код в коде GUI для простоты.

Пример, как отсортировать ваш код

(Gui Layer) Codebehind для управления взаимодействием
Бизнес-уровень для манипулирования данными
Уровень данных для манипуляций с базой данных и тому подобное

0 голосов
/ 03 марта 2009

Полагаю, вы скопировали и вставили, верно?

В любом случае, вот небольшая заметка: Когда вы перетаскиваете элементы управления на форму в VS Designer, vs генерирует код для этих элементов управления «обычно в InitializeComponent ()». VS записывает ссылки в вашем классе (например, form1.cs) следующим образом:

private System.Windows.Forms.TreeView treeView1;

это просто объявление переменной типа System.Windows.Forms.TreeView, эта переменная (сама) хранится в стеке, потому что это просто ссылка, ссылка, которая до сих пор не указывает ни на какие объекты кучи ( т.е. NullReference). Теперь эта ссылка бесполезна, и вы не сможете использовать ее, если не инициализируете ее и не указываете ей указывать на реальный объект в куче, и именно это VS делает для вас в конструкторе, она просто добавляет следующую строку в InitializComponents:

this.treeView1 = new System.Windows.Forms.TreeView();

И это строка, которую вы забыли скопировать в другой класс, которая оставила вашу ссылку неинициализированной (т. Е. Все еще NullReference), следовательно, когда вы пытались ее использовать, генерировалось исключение NullReferenceException. Я думаю, это твоя проблема, или, по крайней мере, я так понял. Простите, если я вас не понял!

0 голосов
/ 03 марта 2009

Инициализируйте объект treeView1 перед доступом к нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...