AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [c#] Auf objektevon anderen Formularen zugreifen?!
Thema durchsuchen
Ansicht
Themen-Optionen

[c#] Auf objektevon anderen Formularen zugreifen?!

Ein Thema von dragi · begonnen am 26. Jan 2006 · letzter Beitrag vom 26. Jan 2006
Antwort Antwort
dragi

Registriert seit: 22. Jul 2003
198 Beiträge
 
Delphi 2005 Personal
 
#1

[c#] Auf objektevon anderen Formularen zugreifen?!

  Alt 26. Jan 2006, 11:50
Hallo,

ich verzweifel gerade
In Delphi habe ich Datenbankzugriffe so realisiert, das ich eine Klasse hatte die eine connection aufbauen und schliessen kann und mit den Daten umgehen konnte. Also DataSet und ähnliches beinhaltet. Nun habe ich von dieser Klasse in meinem Form1 ein Objekt erzeugt und konnte in meinem ganzen programm darauf zugreifen. Also z.B. In Form2:
Code:
form1.meineKlasse.connect(Path);
Aber wenn ich nun in C# in meinem Hauptformular ein Objekt erzeuge, kann ich von keinem anderen Formular darauf zugreifen. Wie funktioniert das in c#? Ich weiß nicht weiter...

Gruß

dragi
Delphi 3 Professional @home
Delphi 2005 PE @home
Delphi 2005 Enterprise @work
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: [c#] Auf objektevon anderen Formularen zugreifen?!

  Alt 26. Jan 2006, 12:23
Wie hast du denn die Schnittstelle zum Objekt deklariert? Als Feld, also z.B.
Code:
DataBase dataBase;
?
Dann musst du den richtigen Modifier angeben:
Code:
public class MainForm
{
    public DataBase dataBase;

    // DataBase dataBase; entspricht private DataBase dataBase;
}
Allerdings ist das (weder in C# noch in Delphi) sehr schön, kapsele das Feld lieber in eine Property.
Aber auch als Property der Form finde ich die Lösung nicht sehr schön, da die Datenbank ja nichts mit der GUI zu tun hat. Gerade wenn du nur eine Verbindung hast, bietet sich eine statische Klasse geradezu an, auf diese kannst du im gesamten Projekt zugreifen.
Code:
class DataBase
{
    static void Connect(string path)
    {
    [...]
}
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
dragi

Registriert seit: 22. Jul 2003
198 Beiträge
 
Delphi 2005 Personal
 
#3

Re: [c#] Auf objektevon anderen Formularen zugreifen?!

  Alt 26. Jan 2006, 12:54
Ich habe eine Datei erstellt DBClass.CS und in dieser ist nun meine Klasse:

DBClass.cs
Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace Zeiterfassung
{
    class DB
    {
        SqlConnection con = new SqlConnection();
        SqlDataReader dr = null;
        SqlCommand cmd = null;

        public Boolean ConToDB(string path)
        {
            con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=\"D:\\Zeiterfassung\\Zeiterfassung\\TimeDB.mdf\";Integrated Security=True;Connect Timeout=30;User Instance=True";
            try
            {
                con.Open();
                return true;
            }
            catch (Exception MyExcep)
            {
                MessageBox.Show(MyExcep.ToString());
                return false;
            }
        }

        public Boolean closeCon()
        {
            try
            {
                con.Close();
                return true;
            }
            catch (Exception MyExcep)
            {
                MessageBox.Show(MyExcep.ToString());
                return false;
            }
        }
    }
}
Nun möchte ich einmal irgendwo ein Objekt erzeugen und dieses überall nutzen können. Was du genau mit Feld meinst, ist mir nicht bekannt. Sorry falls es bei mir was länger dauert

dragi
Delphi 3 Professional @home
Delphi 2005 PE @home
Delphi 2005 Enterprise @work
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#4

Re: [c#] Auf objektevon anderen Formularen zugreifen?!

  Alt 26. Jan 2006, 13:04
Ein Feld ist ... nun, eben ein Feld . Hier findest du eine kleine Übersicht über OOP.
Zum Problem kann ich nichts sagen, solange du nicht auch noch den Code deiner Form zeigst (oder meine Frage beantwortest).
Ich will dich aber noch auf eine kleine Unfeinheit deines Codes aufmerksam machen: Die Exception-Handler in deiner Klasse gehören zur GUI und nicht in die Datenbankklasse.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
dragi

Registriert seit: 22. Jul 2003
198 Beiträge
 
Delphi 2005 Personal
 
#5

Re: [c#] Auf objektevon anderen Formularen zugreifen?!

  Alt 26. Jan 2006, 13:46
Ich habe das Objekt einfach so erzeugt:

Code:
DB MyDBClass = new DB();
Aber irgendwie ist mir das alles gerade zu hoch und ich versuche es ohne klasse auch wenn es total unsauber ist. Aber da kommt auch schon die nächste Frage:

In meiner MainForm will ich nun im Form.Load die Connection zur DB herstellen. Also habe ich diese public und static generiert. In meinem UserControl will ich nun die Connection meinem SQLCommand zuweisen bekomme aber eine NullReferencException. Das ist mir total unklar. Ich habe doch das Connection Objekt erzeugt warum kann ich es nciht nutzen?

MainForm:

Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Text;
using System.Windows.Forms;

namespace Zeiterfassung
{
    public partial class MainForm : Form
    {

        private TimeCollect tCol;
        private employee emplo;
        private projects proj;
        public SqlConnection con;

        public MainForm()
        {
            InitializeComponent();
            SetStyle(ControlStyles.DoubleBuffer, true);
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            Rectangle rect = new Rectangle(0, 0, Width, 20);
            Brush Brush1 = new LinearGradientBrush(rect, Color.FromArgb(255, 255, 155), Color.FromArgb(255, 168, 82), LinearGradientMode.Vertical);
            g.FillRectangle(Brush1, rect);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            button3.Image = Resource1.arrow_down_16;
            groupBox1.Visible = false;
            button1_Click(this, null);
            con = new SqlConnection();
            con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=\"D:\\Zeiterfassung\\Zeiterfassung\\TimeDB.mdf\";Integrated Security=True;Connect Timeout=30;User Instance=True";
            try
            {
                con.Open();
            }
            catch (Exception MyException)
            {
                MessageBox.Show(MyException.ToString());
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            splitContainer1.Panel2.Controls.Clear();
            con.Close();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            DateTime dt = new DateTime();
            dt = DateTime.Now;
            label2.Text = dt.ToLongTimeString();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (tCol == null)
            {
                splitContainer1.Panel2.Controls.Clear();
                emplo = null;
                proj = null;
                tCol = new TimeCollect();
                tCol.Dock = DockStyle.Fill;
                splitContainer1.Panel2.Controls.Add(tCol);
                tCol.Show();
            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            if (emplo == null)
            {
                splitContainer1.Panel2.Controls.Clear();
                tCol = null;
                proj = null;
                emplo = new employee();
                emplo.Dock = DockStyle.Fill;
                splitContainer1.Panel2.Controls.Add(emplo);
                emplo.Show();
            }
        }

        private void button7_Click(object sender, EventArgs e)
        {
            if (proj == null)
            {
                splitContainer1.Panel2.Controls.Clear();
                tCol = null;
                emplo = null;
                proj = new projects();
                proj.Dock = DockStyle.Fill;
                splitContainer1.Panel2.Controls.Add(proj);
                proj.Show();
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (groupBox1.Visible == false)
            {
                groupBox1.Visible = true;
                button3.Image = Resource1.arrow_up_16;
            }
            else
            {
                groupBox1.Visible = false;
                button3.Image = Resource1.arrow_down_16;
                button1.PerformClick();
            }
        }

        private void panel2_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            Rectangle rect = new Rectangle(0, 0, Width, Height);
            Brush Brush1 = new LinearGradientBrush(rect, Color.White, Color.Black, LinearGradientMode.Vertical);
            g.FillRectangle(Brush1, rect);
        }
    }
}
UserControl:
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.Windows.Forms;

namespace Zeiterfassung
{
    public partial class employee : UserControl
    {
        public int SaveFlag;
        public SqlDataReader dr = null;
        public SqlCommand cmd = null;

        public employee()
        {
            InitializeComponent();
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            Rectangle rect = new Rectangle(0, 0, Width, 20);
            Brush Brush1 = new LinearGradientBrush(rect, Color.FromArgb(90, 135, 215), Color.FromArgb(7, 59, 148), LinearGradientMode.Vertical);
            g.FillRectangle(Brush1, rect);
        }

        private void employee_Load(object sender, EventArgs e)
        {
            cmd.Connection = MainForm.con;   <----------Hier kommt die Exception!!!
            cmd.CommandText = "SELECT * FROM employee";
            cmd.ExecuteReader();
        }

        private void panel3_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            Rectangle rect = new Rectangle(0, 0, Width, Height);
            Brush Brush1 = new LinearGradientBrush(rect, Color.FromArgb(181, 207, 248), Color.Blue, LinearGradientMode.Vertical);
            g.FillRectangle(Brush1, rect);
        }

    }
}
Es ist doch sicherlich unsauber immer ene Connection zu einer DB aufzubauen und wieder zu schliessen. Die lässt man doch solange das Programm läuft auf, oder?
Delphi 3 Professional @home
Delphi 2005 PE @home
Delphi 2005 Enterprise @work
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz