2009-03-03 2 views
0

Немного глупый вопрос, но застрял в течение длительного времени. Я написал два класса, один из которых представляет собой форму (класс TreeDisplay) и другую, которая содержит логику логики (класс MyTreeNode). Класс TreeDisplay содержит кнопку обзора, чтобы выбрать файл, передать его методу InitatingTree (string filename), который находится в классе MyTreeNode.
Теперь я должен передать это имя параметра string в класс 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.

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

ответ

5

Какова ценность treeView1 в точке останова?

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


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

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); 
} 
+0

Так где же я должен сделать изменения для удаления этого исключения? –

+0

cahnge ваш метод, чтобы принять treeview в качестве параметра, то вы можете передать его с вашего уровня пользовательского интерфейса – cjk

+0

Если вы не возражаете, можете предоставить один синтаксис строк, как это сделать. Спасибо –

0

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

+0

Я тоже это сделал, но ничего не изменилось. –

0

Я думаю, вы скопировали и вставили, верно?

Anyways вот небольшая заметка: Когда вы перетаскиваете элементы управления в форме в 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(); 

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

+0

Привет, спасибо за снятие сомнений. u правы, я вставил его на класс MytreeNode. Но я попробовал синтаксис выше, все еще получил то же самое xception, вы можете указать, где именно я должен поставить эту строку кода? –

+0

На самом деле это зависит, я имею в виду, вы будете использовать этот объект только в этой функции или хотите использовать его на уровне класса. anyways Поместите эту строку кода куда угодно, прежде чем использовать объект, где-нибудь перед этой строкой treeView1.Nodes.Clear() ;. рекомендуется: в начале функции или конструктора – Galilyou

+0

я хочу использовать его на уровне класса. Я написал эту строку над treeView1.Nodes.Clear() все равно получил то же exception.itried, чтобы создать конструктор и передать treeview параметра и использовал эту строку внутри конструктора, но исключение остается. Что-нибудь еще я могу попытаться удалить это исключение? Tanx –

1

As c.k сказал.

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

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

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

+0

Извините, что я не понял, что вы подразумеваете под этим .... Я новичок в C#, поэтому у меня очень мало идеи об этом ... Я не знаю, что положить точно ?? Спасибо .. –

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