2013-08-28 2 views
0

Я пытаюсь создать простую записку для моего собственного использования. Идея состоит в том, чтобы изучить редактирование C#/Mono XML.Ссылка на Null в C# Mono/GTK #

Я не могу найти NullReference, о котором компилятор жалуется. Не знаю, почему. Я не вижу этого. После нескольких дней поиска я сдаюсь ... помогите. :)

Вот код, который вызывает ошибку. Приложение работает нормально, пока я не нажму кнопку «Добавить новую заметку». Он просто падает. Функция add_activated запускается при нажатии кнопки, и она должна использовать функцию AddNote.

Код не заполнен, и у него наверняка есть некоторые логические ошибки. Но я могу справиться с ними. Мне просто интересно, почему это не сработает.

MainActivity.cs:

// (...) 
protected void add_activated (object sender, System.EventArgs e) 
    { 
     Gtk.TextBuffer buffer;   
     buffer = textview1.Buffer; 

     Note note = new Note(entry3.Text, buffer.Text);  

     AddNote (note); 
    } 


    public static void AddNote (Note note) 
    { 
     string xmlFile = "/home/tomasz/.keeper/keeper.xml"; 

     XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.Load (xmlFile); 
     XmlNode xmlRoot = xmlDoc.CreateElement("keeper"); 

     if (!xmlDoc.DocumentElement.Name.Equals("keeper")) 
     {  
      xmlDoc.AppendChild (xmlRoot); 
     } 

     XmlNode xmlNote = xmlDoc.CreateElement ("note"); 
     XmlNode xmlTitle = xmlDoc.CreateElement ("title"); 
     XmlNode xmlText = xmlDoc.CreateElement ("text"); 

     xmlRoot.InsertAfter (xmlRoot.LastChild, xmlNote); 
     xmlTitle.InnerText = note.Title; 
     xmlNote.InsertAfter (xmlNote.LastChild, xmlTitle); 
     xmlText.InnerText = note.Text; 
     xmlNote.InsertAfter (xmlNote.LastChild, xmlText); 

     xmlDoc.Save (xmlFile); 
    } 


    protected void remove_activated (object sender, System.EventArgs e) 
    { 
     throw new System.NotImplementedException(); 
    } 
    } 
} 

Note.cs:

using System; 

namespace Keeper 
{ 
public class Note 
{ 
    private string title; 
    private string text; 

    public string Title { 
     get 
     { 
      return this.title; 
     } 
     set 
     { 
      this.title = value; 
     } 
    } 
    public string Text 
    { 
     get 
     { 
      return this.text; 
     } 
     set 
     { 
      this.text = value; 
     } 
    } 

    public Note (string title, string text) 
    { 
     this.Title = title; 
     this.Text = text; 
    } 
} 
} 
+1

Вы должны размещать полное сообщение, предоставленное runtime. –

+1

Вы пытались отладить это? –

ответ

0

Непосредственная проблема заключается в том, что вы получили аргументы InserAfter вперемешку. Первым должен быть узел для вставки, а второй должен быть опорным узлом. У корневого элемента еще нет детей, поэтому LastChild будет null и, следовательно, свободой. Использование null в качестве контрольной точки действителен, но не как узел для добавления.

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