Archief - [PROG]C#.net Class sharing into mdi forms

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

GrAmLin

Legacy Member
Dag Mensjes!

Ik zit met een klein probleem,

Ik ben een programma aan het schrijven voor mijn dvds te ordenen, maar zit met een klein probleem.

Ik werk met een access database waar ik de data opsla in een dataset, alles werkt, maar als ik in mijn mdi form klik op een "filmnaam" (bv The Matrix) dan gaat er een nieuwe form open met het detail van die bepaalde film. Ik zend een dataset door met dat bepaalde record, dus bij het openen naar het nieuwe form.

myDB = new AccesDb(myGlobels.path.ToString()); // dat myglobels is het path naar de access db)

Maar als ik dan weer op een andere film wil klikken, en en dus er weer info uit de dataset moet gehaald worden dan lukt dit niet meer, dan is hij die dataset kwijt. Dit werkt dus één keer en nadien niet meer.

Ik heb wel in het detail scherm die bepaalde classe van mijn databese opnieuw aangemaakt, ik denk dat hij daar zijn data kwijt is.

private void detail_Load(object sender, EventArgs e)
{
myGlobels = new Globals(); // HIER LOOPT HET DENK IK MIS
myDB = new AccesDb(myGlobels.path.ToString()); // HIER LOOPT HET DENK IK MIS

myDB.initDataset("genres", "SELECT * FROM db_genres"); // initalizeren
myDB.fillDataset("genres", "SELECT * FROM db_genres ORDER BY genre");

foreach (DataRow dr in myDB.DS.Tables["genres"].Rows)
{
cbGenre.Items.Add(dr["genre"].ToString());
}

string strNaam = myDS_item.Tables["dvds_selected"].Rows[0]["naam"].ToString();
textBox1.Text = strNaam;
this.Text = strNaam;
}


Het ideale zou zijn dat ik een classe kan "delen" over al mijn forms die ik open doe. Zodat de waarden opgeslaan worden.

Daar had ik gedacht aan een static class, maar wete niet juist hoe dit werkt, of bestaan er nog andere mogelijkheden om een classe public te maken over al de forms. zonder ze telkens opnieuw te moeten initializeren?

Dit is een deel van mijn classe,

namespace dvdlister.classes
{
class AccesDb
{
public OleDbConnection dbCon;
public OleDbCommand dbCmd;
public OleDbDataAdapter dbDa;
public OleDbDataReader dbDr;
public static DataSet ds;
public DataTable dt;
public DataRow dr;
public string constr;
public AccesDb()
{
constr = "provider = microsoft.jet.oledb.4.0; data source=" +
@"C:\temp\films.mdb";
initmdb();
}

public AccesDb(string mdb) // deze roep ik aan
{
constr = "provider = microsoft.jet.oledb.4.0; data source=" + mdb;
initmdb();
}

public void initmdb()
{
try
{
dbCon = new OleDbConnection();
dbCon.ConnectionString = constr;
dbCmd = new OleDbCommand();
dbCmd.Connection = dbCon;
dbDa = new OleDbDataAdapter(dbCmd);
ds = new DataSet();
//uitbreidbaar met andere initialisaties dr; dt; reader; ...
}
catch (Exception x)
{
System.Windows.Forms.MessageBox.Show("fout initmdb " + x.Message);
}
}
public void initDataset(string tabelNm, string sql)
{
try
{
sql = sql.Replace(";", "");
dbCmd.CommandText = sql + " where 1 = 0";
dbDa.Fill(ds, tabelNm);
}
catch (Exception x)
{
System.Windows.Forms.MessageBox.Show("fout initds " + tabelNm +
": " + x.Message);
}

}
public void initDataset_free(string tabelNm, string sql)
{
try
{
sql = sql.Replace(";", "");
dbCmd.CommandText = sql;
dbDa.Fill(ds, tabelNm);
}
catch (Exception x)
{
System.Windows.Forms.MessageBox.Show("fout initds " + tabelNm +
": " + x.Message);
}

}
public void fillDataset(string tabelNm, string sql)
{
try
{
ds.Tables[tabelNm].Clear();
dbCmd.CommandText = sql;
dbDa.Fill(ds, tabelNm);
}
catch (Exception x)
{
System.Windows.Forms.MessageBox.Show("fout fillds " + tabelNm +
": " + x.Message);
}

}
public void fillDataset(string tabelNm, string sql, bool isnew)
{
try
{
if (!isnew) ds.Tables[tabelNm].Clear();
dbCmd.CommandText = sql;
dbDa.Fill(ds, tabelNm);
}
catch (Exception x)
{
System.Windows.Forms.MessageBox.Show("fout fillds " + tabelNm +
": " + x.Message);
}
}

public void doNonQuery(string sql)
{
try
{
dbCon.Open();
dbCmd.CommandText = sql;
dbCmd.ExecuteNonQuery();
dbCon.Close();
}
catch (Exception x)
{
System.Windows.Forms.MessageBox.Show("fout nonquery " + x.Message);
}
finally
{
dbCon.Close();
}
}
public ConnectionState status()
{
return dbCon.State;
}
public DataSet DS
{
get { return ds; }
set { }
}
}
}


Ik moet denk ik die classe public maken + static.

Hmzz, kan er iemand helpen?

Met vriendelijke groeten!
:music:

Tyfius

Legacy Member
Jij bent op zoek naar het Singleton patroon.
http://www.yoda.arachsys.com/csharp/singleton.html
Ik gebruik voornamelijk de 4de methode, ze werkt en is veilig.

Voorbeeld:
Code:
namespace Sihia.Core.Preferences
{
        static readonly Preferences instance = new Preferences();
        
        static Preferences()
        {
        }
        
        Preferences()
        {
        }
        
        public static Preferences Instance
        {
                // You cannot use this to access static variables and methods.
                get { return instance; }
        }
}

namespace Sihia.Gui.PreferencesWindow
{
        public function DoApply()
        {
                // Er zijn hier 2 mogelijkheden.
                // Ofwel roep je de instantie rechtstreeks aan:
                Preferences.Instance.SomeFunction();
                
                // Ofwel maak je een link die je dan makkelijker kan gebruiken.
                Preferences pref = Preferences.Instance;
                pref.SomeFunction();
        }
}
Het is niet nodig om SomeFunction() ook static te gaan declareren, mocht je dat denken.

GrAmLin

Legacy Member
@Tyfius

Bedankt voor je uitleg, ondertussen had ik het ook gevonden met mijn classe static te maken,

nu graak ik overal aan mijn datasets in éénder welke form zonder opnieuw classe te declareren!

Handig!

Met vriendelijke groeten!! :niceone:

Ice

Legacy Member
GrAmLin zei:
@Tyfius

Bedankt voor je uitleg, ondertussen had ik het ook gevonden met mijn classe static te maken,

nu graak ik overal aan mijn datasets in éénder welke form zonder opnieuw classe te declareren!

Handig!

Met vriendelijke groeten!! :niceone:

myGlobAls is met een A
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan