كيفية تمرير معلمة سلسلة من أسلوب من فئة واحدة إلى فئة أخرى في نفس مساحة الاسم؟

StackOverflow https://stackoverflow.com/questions/606263

  •  03-07-2019
  •  | 
  •  

سؤال

وسؤال سخيف ليتل، ولكن حصلت على تمسك لفترة طويلة. كنت قد كتبت فئتين واحد وهو نموذج (الطبقة TreeDisplay) وغيرها التي تحتوي على منطق buiseness (الطبقة MyTreeNode). تحتوي TreeDisplay الطبقة تصفح زر لتحديد ملف تمريرها إلى طريقة <م> initiatingTree (سلسلة اسم الملف) وهو في الصف MyTreeNode.
الآن لا بد لي من تمرير هذه السلسلة المعلمة اسم الملف إلى الدرجة MyTreeNode. عند تشغيل قانون بلدي ملف XML الذي قمت باختيار هو مبين في النص ولكن ليس في تريفيف.
لقد كتبت الجزء من التعليمات البرمجية لكنه رمي NullReferenceException (مرجع كائن لم يتم تعيين إلى مثيل كائن). عندما writeen رمز كله في 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 نقطة ()، رمز يخرج من هذا الخط، ويدخل NullReferenceException الصيد كتلة رمي.

الرجاء المساعدة للعثور على السبب الجذري للاستثناء. شكرا.

هل كانت مفيدة؟

المحلول

ما هي قيمة 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); 
}

نصائح أخرى

وكما قال c.k.

وليس لديك الوصول إلى usercontrols من طبقة عملك كمعيار. هل لي أن أقترح عليك أن تبقي لكم السيطرة على التعليمات البرمجية في رمز واجهة المستخدم الرسومية وراء البساطة.

ومثال كيفية فرز التعليمات البرمجية

(واجهة المستخدم الرسومية طبقة) Codebehind للسيطرة على التفاعل
طبقة رجال الأعمال لمعالجة البيانات
طبقة البيانات للتلاعب قاعدة البيانات ومثل

وتهيئة الكائن treeView1 قبل الوصول إليه.

واعتقد انك نسخ ولصق، أليس كذلك؟

وعلى أي حال وهنا ملحوظة صغيرة: عند سحب عناصر التحكم في نموذج في 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. أعتقد أن هذا هو المشكلة أو على الأقل هذه هي الطريقة التي يمكنني أن أفهم ذلك. يغفر لي إذا كنت فشلت في فهم لك!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top