Avatar billede noem Nybegynder
13. august 2006 - 17:47 Der er 16 kommentarer og
2 løsninger

Problemer med klasser under klasser

jeg har 2 klasser


SaSMS.Datainterface
SaSMS.SaSMS_User

Jeg vil gerne have den ene klasse til at være en del af den anden klasse, så jeg kan tilgå den noget ala

objSaSMSDatainterface.user.method();

jeg har lavet klasserne, og i klassen SaSMS.dataInterface har jeg lavet en variable der er ser således ud:


public SaSMS.SaSMS_User User = new SaSMS.SaSMS_User(this);


den anden klasse SaSMS_User har en constructor der ser noget ala sådan ud:

        /// <summary>
        /// Constructor without login
        /// </summary>
        /// <param name="objSaSMS">Reference to the SaSMS.Daainterface</param>
        public SaSMS_User(ref SaSMS.dataInterface objSaSMS)
        {
            this._objSaSMS = objSaSMS;
        }


hvorfor virker det ikke ?? de fejlder kommer er her:
Error    4    Keyword 'this' is not available in the current context    C:\Documents and Settings\Thomass\My Documents\Visual Studio 2005\Projects\WindowsApplication1\WindowsApplication1\clsSaSMS_Datainterface.cs    37    65    SaSMS-Interface
Error    6    Argument '1' must be passed with the 'ref' keyword    C:\Documents and Settings\Thomass\My Documents\Visual Studio 2005\Projects\WindowsApplication1\WindowsApplication1\clsSaSMS_Datainterface.cs    37    65    SaSMS-Interface
Error    5    The best overloaded method match for 'SaSMS.SaSMS_User.SaSMS_User(ref SaSMS.dataInterface)' has some invalid arguments    C:\Documents and Settings\Thomass\My Documents\Visual Studio 2005\Projects\WindowsApplication1\WindowsApplication1\clsSaSMS_Datainterface.cs    37    40    SaSMS-Interface
Avatar billede Syska Mester
13. august 2006 - 22:11 #1
:-s

Kan du smide begge klasser .... og din navngivning synes jeg er ldit forvirende :-)

SaSMS.SaSMS_User(this);
til
SaSMS.SaSMS_User(ref this);
Avatar billede noem Nybegynder
13. august 2006 - 22:43 #2
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace SaSMS
{
    class SaSMS_User
    {
        /// <summary>
        /// Internal pointer to the SaSMS Object
        /// </summary>
        private SaSMS.dataInterface _objSaSMS;

        /// <summary>
        /// Indication if user is logged in :)
        /// </summary>
        private Boolean _loggedin = false;

        /// <summary>
        /// Array with userInfo
        /// </summary>
        private ArrayList _userInfo = new ArrayList();

        /// <summary>
        /// Main constructor
        /// </summary>
        /// <param name="username">The username of the user</param>
        /// <param name="objSaSMS">reference to the main SaSMS object</param>
        public SaSMS_User(string username, ref SaSMS.dataInterface objSaSMS)
        {
            this._objSaSMS = objSaSMS;

            System.Data.DataSet dsTmp = new System.Data.DataSet();

            dsTmp = this._objSaSMS.dbQuery("select Navn, [Type-BESKRIV] from Kode_bruger");
            if (dsTmp == null) return;

            //Set internal Array with userInfo
            this._userInfo = dsTmp.Tables[0].Rows[0].ItemArray;
            this._loggedin = true;
        }
     
        /// <summary>
        /// Constructor without login
        /// </summary>
        /// <param name="objSaSMS">Reference to the SaSMS.Daainterface</param>
        public SaSMS_User(ref SaSMS.dataInterface objSaSMS)
        {
            this._objSaSMS = objSaSMS;
        }
        /// <summary>
        /// See is a user is logged in
        /// </summary>
        /// <returns>Returns true if a user is logged into the SaSMS system</returns>
        public Boolean loggedin()
        {
            if (this._loggedinUser == string.Empty)
                return false;
            return true;
        }

        /// <summary>
        /// Login user to SaSMS system
        /// </summary>
        /// <param name="userName">The username of the USER (this is also the password)</param>
        /// <returns>true on sucessfyl login</returns>
        public Boolean login(string userName)
        {
            if (!this.validateUser(userName)) return false;

            this._loggedinUser = userName;
            return true;
        }

        /// <summary>
        /// Logout SaSMS user
        /// </summary>
        void logout()
        {
            this._loggedinUser = string.Empty;
        }

        /// <summary>
        /// Validates if a user Exists in the SaSMS Database
        /// </summary>
        /// <param name="userName"></param>
        /// <returns></returns>
        public Boolean validateUser(string userName)
        {
            DataSet dsTmp = new DataSet();
            dsTmp = this.dbQuery("Select [TYPE-BESKRIV] from Kode_bruger where [TYPE-BESKRIV] = '" + userName.ToUpper().ToString() + "'");
            return (dsTmp == null) ? false : true;
        }
    }
}
Avatar billede noem Nybegynder
13. august 2006 - 22:43 #3
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;

namespace SaSMS
{
    class dataInterface
    {
        #region Internal variables...
        /// <summary>
        /// Hostname of my database
        /// </summary>
        private string  _db          = string.Empty;

        /// <summary>
        /// Username of my databaseUser
        /// </summary>
        private string  _dbUser      = string.Empty;

        /// <summary>
        /// Password of my databaseUser
        /// </summary>
        private string  _dbPass      = string.Empty;

        /// <summary>
        /// True if connected by trusted connection
        /// </summary>
        private Boolean _dbTrusted  = false;

        /// <summary>
        /// Oledb link to our database
        /// </summary>
        private SqlConnection _dbCon;

        public SaSMS.SaSMS_User User = new SaSMS.SaSMS_User(this);
       

        #endregion

        #region constructors

        /// <summary>
        /// Constructor for trusted connection
        /// </summary>
        /// <param name="db"></param>
        /// <param name="dbName"></param>
        public dataInterface(string db,string dbName)
        {
            string strconString = "Server=" + db + ";Database=" + dbName + ";Trusted_Connection=True;";

            try
            {
                _dbCon = new SqlConnection(strconString);
                _dbCon.Open();
            }
            catch (Exception e)
            {
                System.Windows.Forms.MessageBox.Show(e.Message);
            }
            finally
            {
                this._dbTrusted = true;
            }
        }

        /// <summary>
        /// Constructor that connnect's to SaSMS database with mixed sercurity
        /// </summary>
        /// <param name="db">Hostname of the SQLDatabase</param>
        /// <param name="dbUser">Username of the databaseUser</param>
        /// <param name="dbPass">Password of the DatabaseUser</param>
        /// <param name="dbName">The name of the database</param>
        /// <returns>True on sucess</returns>
        public dataInterface(string db, string dbUser, string dbPass, string dbName)
        {
            //ConnectionString
            string strconString = "Data Source=" + db + ";Initial Catalog=" + dbName +
                              ";User Id=" + dbUser + ";Password=" + dbPass + ";";
            try
            {
                _dbCon = new SqlConnection(strconString);

            }
            catch (Exception e)
            {
                System.Windows.Forms.MessageBox.Show(e.Message);
            }
            finally
            {
                this._dbTrusted = false;
            }
        }

        #endregion

        #region User methods...
        /// <summary>
        /// Return a list of users in SaSMS Database...
        /// </summary>
        /// <returns>ArrayList of users in SaSMS</returns>
        public System.Collections.ArrayList getUserlist()
        {
            System.Collections.ArrayList alTmp = new System.Collections.ArrayList();

            foreach (System.Data.DataRow test2 in this.dbQuery("Select [Navn] from Kode_bruger order by Navn").Tables[0].Rows)
            {
                alTmp.Add(test2.ItemArray[0]);

            }
            return alTmp; //this.dbQuery("Select [Navn] from Kode_bruger").Tables[0].Rows[0].ItemArray;
        }

       




        #endregion

        #region Raw database methods...

        /// <summary>
        /// Preform a Query in the SaSMS database
        /// </summary>
        /// <param name="sqlQuery">SQL Query</param>
        /// <returns>Dataset with data</returns>
        public System.Data.DataSet dbQuery(string sqlQuery)
        {
            //His der ikke er forbindelse til database så forbind...
            if (_dbCon.State != ConnectionState.Open)
                _dbCon.Open();

            SqlDataAdapter _sqlA = new SqlDataAdapter(sqlQuery, _dbCon);
            DataSet _tmpreturn = new DataSet();
       
            try{
                _sqlA.Fill(_tmpreturn,"0");
                if (_tmpreturn.Tables[0].Rows.Count == 0)
                    return null;
                return _tmpreturn;
            }
            catch (Exception e)
            {
                System.Windows.Forms.MessageBox.Show(e.Message);
            }
            return null;
        }

        #endregion

    }
}
Avatar billede noem Nybegynder
13. august 2006 - 22:45 #4
og hvad er der forresten forvirrende ved den navngivning :)
Avatar billede Syska Mester
13. august 2006 - 23:21 #5
public SaSMS.SaSMS_User User = new SaSMS.SaSMS_User(this);
til
public SaSMS.SaSMS_User User = new SaSMS.SaSMS_User(ref this);
Avatar billede Syska Mester
13. august 2006 - 23:22 #6
Du må slet ikke angive "this" der .... i roden af klassen, det kan du kun i din constructor, method's og properties
Avatar billede Syska Mester
13. august 2006 - 23:23 #7
Flyt den ind i din constructor i din "class dataInterface" så burde det virke.....

// ouT
Avatar billede noem Nybegynder
13. august 2006 - 23:27 #8
Error    1    Cannot pass '<this>' as a ref or out argument because it is read-only    C:\Documents and Settings\Thomass\My Documents\Visual Studio 2005\Projects\WindowsApplication1\WindowsApplication1\clsSaSMS_Datainterface.cs    51    50    SaSMS-Interface

:(
Avatar billede noem Nybegynder
13. august 2006 - 23:28 #9
dohh class skulle være public
Avatar billede Syska Mester
13. august 2006 - 23:29 #10
Har du flyttet det ind i don constructor?

og så ser jeg ikke nogen grund til at smide den med som en ref, da du alligevel får en ref tilbage til det org object når du sender this videre som er en klasse....

// ouT
Avatar billede noem Nybegynder
13. august 2006 - 23:30 #11
hmm stadigvæk samme fejl:

Error    1    Cannot pass '<this>' as a ref or out argument because it is read-only    C:\Documents and Settings\Thomass\My Documents\Visual Studio 2005\Projects\WindowsApplication1\WindowsApplication1\clsSaSMS_Datainterface.cs    51    50    SaSMS-Interface
Avatar billede Syska Mester
13. august 2006 - 23:30 #12
Ville kun give mening at lave ref på value types ... sådan som min hjerne lige husker, men tager måske fejl ....

// ouT
Avatar billede noem Nybegynder
13. august 2006 - 23:32 #13
har flytte ind i constructor, og har fjernet ref..

stadigvæk den read-only fejl :(
Avatar billede noem Nybegynder
13. august 2006 - 23:33 #14
objekter bliver vist altid overført som ref, så det burde ikke gøre nogle forskel
Avatar billede noem Nybegynder
13. august 2006 - 23:40 #15
hov nu virker det, (spørg mig ikke hvorfor det ikke virkede før, var nok bare træt)

tak for hjælpen :)
Avatar billede noem Nybegynder
13. august 2006 - 23:41 #16
nu virker det (ved ikke hvorfor det ikke virkede før, er nok lidt træt)

tak for hjælpen..
Avatar billede Syska Mester
13. august 2006 - 23:42 #17
netop, derfor jeg tænkte på om der var nogen speciel grund til at du brugte ref, men er da gald for at det virker nu ....

// ouT
Avatar billede Syska Mester
13. august 2006 - 23:58 #18
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB