简体   繁体   中英

How can I pass value from one subclass to another subclass in a main class C#?

I create a class named MyMainClass

namespace MyTest
{
        private void frmMain_Load(object sender, EventArgs e)
        {
            MyMainClass myVar = new MyMainClass();

            myVar.sub1.sb1A = "value 1A";
            myVar.sub1.sb1B = "value 1B";

            MessageBox.Show(myVar.sub2.wantPassString);
            //I want to print the value "I've got value value 1A"
         }            
    public class MyMainClass
    {
        public subClass1 sub1 = new subClass1();
        public subClass2 sub2 = new subClass2();

        public class subClass1
        {
            public string sb1A{get;set;}
            public string sb1B{get;set;}
        }
        public class subClass2
        {
            public string sb2A{get;set;}
            public string sb2B{get;set;}
            // a1a is a value that I want to get from subClass1
            string a1a = subClass1.sb1A;

            public string wantPassString {get{return "I've got value " + a1a;}}
        }
    }
}

How can I pass the value from subClass1.sb1A to the string a1a or wantPassString in subClass2 ? when I call in frmMain_Load

The normal approach would be to pass the class through the constructor. This works:

public class MyMainClass
{
    public MyMainClass()
    {
        sub1 = new subClass1();
        sub2 = new subClass2(sub1);
    }
    public subClass1 sub1;
    public subClass2 sub2;

    public class subClass1
    {
        public string sb1A{get;set;}
        public string sb1B{get;set;}
    }
    public class subClass2
    {
        public subClass2(subClass1 sub1)
        {
            this.sub1 = sub1;
        }
        public string sb2A{get;set;}
        public string sb2B{get;set;}
        subClass1 sub1;

        public string wantPassString {get{return "I've got value " + sub1.sb1A;}}
    }
}

One option is create method instead of property like

     public string wantPassString(string param)
     {
         return "I've got value " + param;
     }

and in frmMain_Load call this method

 MessageBox.Show(myVar.sub2.wantPassString(a1a));

Create a third class to hold the data.

public MainClass
{
    private class sharedClass
    {
       internal string sb1A { get; set; }
    }

    public class subClass1
    {

        private readonly sharedClass _shared;
        internal subClass1(sharedClass shared)
        {
            this._shared = shared;
        } 

        public string sb1A
        {
            get
            {
               return this._shared.sb1A;
            }
            set
            {
                this._shared.sb1A = value;
            }

        public string sb1B{get;set;}
    }

    public class subClass2
    {
        private readonly sharedClass _shared;
        public subClass2(shared s) 
        { 
            _shared = s;
        }
        public string sb2A{get;set;}
        public string sb2B{get;set;}


        public string wantPassString {get{return "I've got value " + _shared.sb1;}}
    }

    private readonly sharedClass _shared = new sharedClass();
    private readonly subClass1 _subClass1;
    private readonly subClass2 _subClass2;

    public MainClass() 
    {
        this._subClass1 = new subClass1(this._shared);
        this._subClass2 = new subClass2(this._shared);
    }
}

You can add additional property and method and pass it as a parameter:

 public string sb2C{ get; set; }
        public string getData(string strParam)
        {
            return sb2C= strParam;
        }

Then on your frmMain_Load:

MessageBox.Show(myVar.sub2.getData(myVar.sub1.sb1B));
//This would also populate sb2C that will hold the data from the other class

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM