Laden...

Forenbeiträge von solick Ingesamt 56 Beiträge

10.04.2012 - 16:38 Uhr

Kann ich das ggf. mit einer abstrakten Basisklasse lösen?

10.04.2012 - 16:12 Uhr

Nein, wenn ich die Methode in der Basisklasse private deklariere kann ich sie ja nie durch das Objekt aufrufen.

Ich geb mal ein Beispiel:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            foo1 f1 = new foo1("foo1");
            foo2 f2 = new foo2("foo2", "foo1");


            f1.printIt();
            f2.printIt(false);
            f2.printIt(true);
            f2.printIt();

            Console.ReadKey();
        }
    }


    class foo1
    {

        protected String _str;


        public foo1(String str)
        {
            _str = str;
        }


        public void printIt()
        {
            Console.WriteLine("Str: " + _str);
        }


    }


    class foo2 : foo1
    {
        String _str2;


        public foo2(String str2, String str) : base(str)
        {

            _str2 = str2;
        }

        public void printIt()
        {
            Console.Write("foo2 -Str: " + base._str);

        }

        public void printIt(bool b)
        {
            if (b)
            {
                Console.WriteLine("Str2: " + _str2);
            }
            else
            {
                Console.Write("Str: " + base._str);
            }
        }

    }
}


f2.printIt() soll verhindert werden.

Beste Grüße

solick

10.04.2012 - 16:04 Uhr

Hi,

habe da mal eine Verständnisfrage:

Mit sealed kann man ja bei abgeleiteten Klassen eine weitere Vererbung verhindern.

Wenn ich sealed aber in der Basisklasse verwenden möchte, dann meckert er.

Kann man auch die Methode einer Basisklasse für eine Vererbung sperren?

Hintergrund:

Ich möchte in einer vererbten Klasse die Methode einer Basisklasse nicht aufrufbar machen.

Vielen Dank und beste Grüße

Solick

06.03.2012 - 10:12 Uhr

Hi, danke für den Hinweis, Rekursion ist klar aber hier nicht notwendig, weil es nicht so viele Controls geben wird (ist im Prinzip ein kleiner Kreis / Raute etc. mit etwas Text drinnen)...

Danke nochmals für die guten Hinweise und beste Grüße

Solick

05.03.2012 - 12:32 Uhr

Hi,

geht, man darf nur nicht vergessen, dem Control selbst auch einen Tooltip zu setzen, weil das ja nicht in der Collection drinnen ist.

Hab es jetzt mit folgender Methode gelöst, der ich aus dem Form das Tooltip-Object übergebe.


public void setToolTip(ToolTip ttp)
        {
            ttp.SetToolTip(this, getInfo());
            foreach(Control c in this.Controls)
            {
                ttp.SetToolTip(c, this.getInfo());

            }

        }

getInfo() gibt dann den ToolTip Text aus der Klasse.

Beste Grüße

Solick

05.03.2012 - 11:46 Uhr

Hi herbivore,

ich probiere das heute nachmittag mal aus und gebe Bescheid wie es gelaufen ist.

Beste Grüße

Solick

05.03.2012 - 10:32 Uhr

Hi Herbivore,

vielen Dank für die Inputs.

Ich denke, die zweite Variante ist die bessere. Nur zur Sicherheit noch die Nachfrage:

Sollte ich dann im Konstruktor das Tooltip Objekt direkt übergeben und dann über alle Controls im Control iterieren? Im Control ein Tooltip Objekt zu generieren und dann der Form-Control Collection anzuhängen wäre ja auch eine Möglichkeit oder?

Beste Grüße

Solick

05.03.2012 - 09:38 Uhr

Hi,

dazu müsste ich das Label ja ausserhalb des Controls zugänglich machen, das möchte ich aber nicht.

Grüße

02.03.2012 - 17:42 Uhr

Hi,

habe mich ausgehend von diesem Thread mal mit dem Thema beschäftigt und besonders an dem erkennen eines näherungsweisen Klick an einer Linie geknabbert.

Meine Lösung sieht wie folgt aus:



_start //Klasse, die mit CenterX und CenterY die Koordinaten in der Mitte eines Controls ausgibt als Punkt
_end //wie oben nur der Endpunkt
//Beide zusammen bilden die Endpunkte der Linie, die gezeichnet wird

sensitivity: Ist der Abstand zur Linie, die der Punkt (Mausklick) mindestens haben sollte.

public Boolean PointNearEdge(Int32 X, Int32 Y, double sensitivity)
        {
            Boolean ret = false;

            //Länge der Dreiecksseiten berechnen
            double a = Math.Sqrt(Math.Pow(_start.CenterX - X,2) + Math.Pow(_start.CenterY - Y,2));
            double b = Math.Sqrt(Math.Pow(X - _end.CenterX, 2) + Math.Pow(Y - _end.CenterY, 2));
            double c = Math.Sqrt(Math.Pow(_end.CenterX - _start.CenterX, 2) + Math.Pow(_end.CenterY - _start.CenterY, 2));

            double P = (a + b + c) / 2; //Umfang durch 2

            double alpha = 2 * Math.Asin(Math.Sqrt(((P-b)*(P-c)) / (b*c))); //Winkel
            double beta = 2 * Math.Asin(Math.Sqrt(((P - a) * (P - c)) / (a * c)));  //Winkel

            double alphaGrad = (alpha * 180) / Math.PI;
            double betaGrad = (beta * 180) / Math.PI;
            //Wenn alpha und beta beide kleiner 90 Grad sind, ist der Punkt innerhab der Linienendpunkte. Dann kann die Höhe als Sensitivitätsmaß genommen werden
            //Andernfalls ist der Punkt sowieso außerhalb der Linie.

            double abstand = b * Math.Sin(alpha); //Höhe des Dreiecks, Abstand des Punktes zur Linie


            if (alphaGrad < 90 && betaGrad < 90 && abstand <= sensitivity)
                return true;



            return ret;
        }


Ich habe das direkt in eine Klasse eingebunden, die die Linie beschreibt. So brauche ich ihr nur X und Y des Klicks übergeben und die Sensitivität und er gibt mir true oder false zurück.

Hoffe, es hilft jemandem weiter.

Da ich hier schon so oft gute Hinweise und Lösungsansätze gefunden habe, wollte ich auch mal etwas zurück geben 😃

Beste Grüße

Solick

02.03.2012 - 17:35 Uhr

Hi, ich habe ein eigenes Control in dem u.a. ein Label existiert.

Das Control habe ich mit einem Tooltip verbunden.

Wenn ich nun mit der Maus über das Control gehe, erscheint der Tooltip, wenn ich mit der Maus über dem Label im Control bin, nicht.

Habe schon versucht, das MouseHover Event durchzureichen an das Control, nützt aber nicht. Weiss jemand, ob ich das Tooltip Event von einem Control an ein anderes weiterreichen kann bzw. welches das ist?

Vielen Dank und beste Grüße

Solick

01.03.2012 - 12:50 Uhr

ah ok danke. Hatte mich verlesen und das invalidate aus der Paint Methode heraus aufgerufen, das gab Graphiksalat. Jetzt funktioniert es.

Vielen Dank und Grüße

Solick

01.03.2012 - 12:19 Uhr

ja das hatte ich mir angeschaut. Ich will aber nicht in ein Image zeichnen sondern die Controls mit einander verbinden. In ein Image kann ich ja keine Controls legen...

Grüße

Solick

01.03.2012 - 11:56 Uhr

Hi allerseits,

wollte kurz fragen ob es zu folgendem Vorgehen eine Alternative gibt oder ob aus Eurer Sicht etwas dagegen spricht:

Ich Habe einige Controls in einem Form, welche ich per Maus bewege. Zusätzlich zeichne ich Linien zwischen diesen Controls.

Nun möchte ich, dass sich die Linien mit bewegen, wenn ich ein Control bewege.

Nach einigem suchen und probieren sieht meine Lösung so aus, dass ich die bisherige Linie in der BackColor nochmal zeichne und dann die neue Linie zeichne.

Funktioniert auch soweit gut, nur ist meine Befürchtung, dass es bei vielen Linien und Controls zu zeitverzägerungen oder ähnlichen Problemen kommen kann.

Wäre über ein kurzes Feedback zu meinem Ansatz sehr dankbar.

Beste Grüße

solick

16.09.2011 - 08:32 Uhr

Hallo,

meinst Du Fenster innerhalb eines Programms oder meinst Du Fenster verschiedener Programme?

Zu 1. Innerhalb einer Anwendung kannst Du die Events der jeweiligen Fenster ansprechen, ich würde dazu extra offentliche Methoden schreiben, die dann nach bestimmten Regeln das Event starten.

Zu 2. Da kenne ich mich zu wenig aus, es würde ja auch davon abhängen, was für ein Programm das ist, ob auch in C# /.Net geschreiben oder eine ganz andere Anwendung. Da müssten sich mal die Experten hier zu Wort melden.

Grüße Solick

24.07.2011 - 17:35 Uhr

Eine Möglichkeit wäre, mit logischer Programmierung (z.B. Prolog zu arbeiten).

Dort beschreibst Du die Fakten und Regeln und durch Backtracking wird dann der Lösungsraum durchsucht. Ich habe mal ein Beispiel gesehen, wie das Spiel die Türme von Hanoi damit gelöst wurde.

Grüße solick

24.07.2011 - 17:30 Uhr

Hallo, das Thema ist zwar schon etwas älter, aber vielleicht interessiert es ja trotzdem mal jemanden:

Da ich mich mit KI, vor allem mit logischer Programmierung, im Rahmen meiner Diplomarbeit beschäftigt habe, kann ich ein paar gute Bücher zur Einführung in die KI emfpehlen. Diese Behandeln auch andere Bereiche der KI wie:

  • Fuzzy Logic
  • Suche-Verfahren
  • Logik-Programmierung
  • künstliche neuronale Netze

etc.

Ertel, Wolfgang: Grundkurs Künstliche Intelligenz. Eine praxisorientierte Einführung. 2. Auflage. Wiesbaden: Vieweg+Teubner, 2009

Lämmel, Uwe; Cleve, Jürgen: Künstliche Intelligenz. München: Carl Hanser Verlag, 2008

Mainzer, Klaus: KI – Künstliche Intelligenz. Grundlagen intelligenter Systeme. Darmstadt: Wissenschaftliche Buchgesellschaft 2003

Beste Grüße solick

01.10.2010 - 11:04 Uhr

Ja das habe ich schon versucht es gibt aber leider ein Problem:

Beim Aufruf von onDropDown ist der Wert ja schon geändert, es gibt ja leider kein OnChanging Event.

Vom Vorgehen her müsste ich bei einer Änderung überprüfen, ob der Kalender geöffnet wurde und dann die Änderung abbrechen, die Änderung des Wertes geschieht jedoch vor dem Öffnen des Calenders, also vor onDropDown...

Offensichtlich ist der Kalender ein natives Windows Element. Ich habe auch schon versucht, das klicken auf den Pfeil, der das Element öffnet abzufangen, das scheint aber nicht zu gehen...

Bin ziemlich ratlos...

01.10.2010 - 10:09 Uhr

Also Das Problem habe ich jetzt gefunden, nur die Lösung gelingt nicht.

Folgendes passiert:

Beispiel: Heute ist der 1.10.2010

MinDate = 1.8.2010
MaxDate = 31.8.2010

Wenn man nun den DTP klickt, öffnet sich die Kalendersicht. Dabei versucht der Kalender das aktuelle Datum vorzubelegen. Da das nicht geht, nimmt er das letzte mögliche Datum, hier den 31.8.2010. Dadurch wird aber das ValueChanged Event ausgelöst und der zweite DTP auf 31.8.2010 gesetzt wenn er einen Wert < 31.8.2010 hat.

ich hab jetzt alles mögliche Versucht um das zu verhindern:

  1. Kalender direkt ansprechen geht nicht, man kann zwar Farben etc. manipulieren, aber den Kalender direkt bekomme ich nicht in den Zugriff...

  2. Das ändern des Wertes verhindern bzw. das ValueChanged-Event deaktivieren wenn der Kalender geöffent wird. Geht leider auch nicht, weil die früheste Methode sie ich gefunden habe ist OnDropDown() aber da ist value schon geändert.

Hat noch jemand eine Idee, wie ich das Problem in den GRiff bekommen könnte?

Beste Grüße

Solick

29.09.2010 - 11:22 Uhr

Hallo Herbivore,

habe nochmal etwas rumprobiert und überlegt. Kann es sein, dass beim Klicken des DTP das Objekt versucht, auf das aktuelle Datum zu springen und da das nicht geht dann auf MaxDate springt? Wenn ja, wie könnte man das verhindern?

Beste Grüße

Solick

EDIT:

Jupp hab es darauf eingrenzen können. Wenn ich in ShowUpDown = true setze tritt der Fehler nicht auf...

29.09.2010 - 09:16 Uhr

Hallo Herbivore,

das habe ich gemacht und das Problem eingegrenzt: Wenn ich die Funktion settingsDateTime() auskommentiere funktioniert alles wie es soll. Ich habe nur keine Ahnung, wieso die Zuweisung von MinDate und MaxDate sowie die Zuweisung eines Datums an Value so ein Verhalten auslöst.

Ich hab das Programm Schritt für Schritt debugged und kann nicht feststellen warum bei genutzter Funktion settingsDateTime() der Klick auf den from-DTP der Wert des to-DTP auf MaxDate gesetzt wird...

Beste Grüße

Solick

28.09.2010 - 16:04 Uhr

So, ich habe das Problem eingrenzen können...

Folgenden TestCode habe ich extrahiert:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DTP_Test
{
    public partial class Form1 : Form
    {
        List<DateTimePicker> _DTP_From;
        List<DateTimePicker> _DTP_To;
        Int32 _RowIndex;
        Int32 xpos, ypos;
        DateTime _periodDate;
        public Form1()
        {
            InitializeComponent();

            _RowIndex = 0;
            ypos = 30;
            _periodDate = new DateTime(2010, 8, 1);
            _DTP_From = new List<DateTimePicker>();
            _DTP_To = new List<DateTimePicker>();

            _DTP_From.Add(new DateTimePicker());
            _DTP_To.Add(new DateTimePicker());

            _DTP_From[_RowIndex].Location = new Point(20, 20);
            _DTP_From[_RowIndex].Format = DateTimePickerFormat.Short;
            _DTP_From[_RowIndex].Size = new Size(80, 20);
            _DTP_From[_RowIndex].Name = "From";
            SettingsDateTime(_DTP_From[_RowIndex],_periodDate);
            _DTP_From[_RowIndex].ValueChanged += new EventHandler(DTP_From_ValueChanged);
           

            _DTP_To[_RowIndex].Location = new Point(20,60);
            _DTP_To[_RowIndex].Format = DateTimePickerFormat.Short;
            _DTP_To[_RowIndex].Size = new Size(80, 20);
            _DTP_To[_RowIndex].Name = "To";
            SettingsDateTime(_DTP_To[_RowIndex], _periodDate);
            _DTP_To[_RowIndex].ValueChanged += new EventHandler(DTP_To_ValueChanged);
            

            this.Controls.AddRange(new Control[] {_DTP_From[_RowIndex],_DTP_To[_RowIndex] });
            
        }

        
        
        void DTP_To_ValueChanged(object sender, EventArgs e)
        {
            if (_DTP_From.Count > 0)
            {
                //Wenn Von > Bis, dann Bis = Von setzen
                if (_DTP_From[_RowIndex].Value > _DTP_To[_RowIndex].Value)
                {
                    _DTP_From[_RowIndex].ValueChanged -= DTP_From_ValueChanged;
                    _DTP_To[_RowIndex].ValueChanged -= DTP_To_ValueChanged;

                    _DTP_To[_RowIndex].Value = _DTP_From[_RowIndex].Value;

                    _DTP_From[_RowIndex].ValueChanged += DTP_From_ValueChanged;
                    _DTP_To[_RowIndex].ValueChanged += DTP_To_ValueChanged;
                }
            }
        }

        void DTP_From_ValueChanged(object sender, EventArgs e)
        {

            if (_DTP_From.Count > 0)
            {
                //Wenn Von > Bis, dann Bis = Von setzen
                if (_DTP_From[_RowIndex].Value > _DTP_To[_RowIndex].Value)
                {
                    _DTP_From[_RowIndex].ValueChanged -= DTP_From_ValueChanged;
                    _DTP_To[_RowIndex].ValueChanged -= DTP_To_ValueChanged;

                    _DTP_To[_RowIndex].Value = _DTP_From[_RowIndex].Value;

                    _DTP_From[_RowIndex].ValueChanged += DTP_From_ValueChanged;
                    _DTP_To[_RowIndex].ValueChanged += DTP_To_ValueChanged;
                }
            }

        }

        private void SettingsDateTime(DateTimePicker dtp, DateTime settingDate)
        {

            
            if (dtp.Name == "From")
            {
                dtp.ValueChanged -= DTP_From_ValueChanged;
            }
            else if (dtp.Name == "To")
            {
                dtp.ValueChanged -= DTP_To_ValueChanged;
            }


            dtp.MaxDate = new DateTime(settingDate.Year, settingDate.Month, 1).AddMonths(1).AddDays(-1);
            dtp.MinDate = new DateTime(settingDate.Year, settingDate.Month, 1);


            if (DateTime.Now > dtp.MinDate && DateTime.Now < dtp.MaxDate)
            {

                dtp.Value = DateTime.Now;
            }
            else
            {
                dtp.Value = dtp.MinDate;
            }


            if (dtp.Name == "From")
            {
                dtp.ValueChanged += DTP_From_ValueChanged;
            }
            else if (dtp.Name == "To")
            {
                dtp.ValueChanged += DTP_To_ValueChanged;
            }

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            label1.Text += _DTP_From[_RowIndex].Name;
            label2.Text += _DTP_To[_RowIndex].Name;
        }

        
    }
}

Das Problem scheint die Funktion SettingsDateTime() zu sein. Rufe ich die nicht auf, funktioniert alles reibungslos, nutze ich Sie, wird der ValueChanged Event aufgerufen, sobald man auf den DateTimePicker anklickt.

Die Funktion brauche ich, um abhängig von einem Datum die Datumauswahl auf einen Monat beschränken zu können, mehr macht die Funktion nicht. Die Unterschiedene Ein- und Aushängerei der Eventhandler war in der Originalfunktion nicht vorhanden, sondern von mir nur zu Testzwecken hinzugefügt worden, aber leider ohne Erfolg.

Hat jemand ne Idee, wieso diese Funktion die EventHandler beeinflusst?

28.09.2010 - 11:16 Uhr

Hi,

also ich hab noch weiter getestet komme aber partout nicht darauf.

Das Problem: Beide werden genau gleich initiiert und mit Werten belegt, aber das Problem tritt nur bei _DTP_From auf. Wenn ich bei _DTP_to den DateTimPicker öffne passiert nichts, bei _DTP_From jedoch wird sofort der ValueChanged Event ausgeführt und zwar zweimal hintereinander. beim ersten Mal ist das Wert der letzte Tag des Monats, bezw. MaxDate, beim zweiten mal dann der wirklich ausgewählte wert...

28.09.2010 - 09:34 Uhr

Also das Problem bleibt....

ValueChanged wird schon aufgerufen, wenn ich ich den DTP nur anklicek bzw den Kalender aufrufe... Irgendwie wird dann schon der Wert des DTP geändert...

Edit: Ich hab gerade mal einen Test gebaut, in dem ich nur zwei DTP in ein Form gezogen habe und beide auf das gleiche Event verlinkt habe...

Dort funktioniert es reibungslos, das Event wird nur dann aufgerufen, wernn man das Datum geändert hat.

2 Dinge sind bei meiner Application anders:

  1. Ich initiierte die DTP manuell, also nicht mit der IDE... möglicherweise setzte ich eine Eigenschaft anders oder nciht, die die IDE automatisch setzt

  2. Meine DTP sind Member einer List<DateTimePicker>

Jemand noch ne Idee, woran es liegen könnte?

Beste Grüße

Solick

28.09.2010 - 09:29 Uhr

Also der Code:

void DTP_ValueChanged(object sender, EventArgs e)
        {

            if (_DTP_From.Count > 0)
            {
                //Wenn Von > Bis, dann Bis = Von setzen
                if (_DTP_From[_RowIndex].Value > _DTP_To[_RowIndex].Value)
                {
                    _DTP_From[_RowIndex].ValueChanged -= DTP_ValueChanged;
                    _DTP_To[_RowIndex].ValueChanged -= DTP_ValueChanged;

                    _DTP_To[_RowIndex].Value = _DTP_From[_RowIndex].Value;

                    _DTP_From[_RowIndex].ValueChanged += DTP_ValueChanged;
                    _DTP_To[_RowIndex].ValueChanged += DTP_ValueChanged;
                }
            }

        }

Die EventHandler zeigen beide auf diese Methode.

Das mit zweiten Handler probiere ich gleich mal aus....

27.09.2010 - 15:04 Uhr

Hallo,

ich habe zwei DateTimePicker _from und _to die ich jeweils mit dem MinDate 1. des aktuellen Monats und MaxDate letzter des aktuellen Monats instantiiere.

Nun habe ich beide mit einem Eventhandler DTP_ValueChanged verbunden.

in dieser Funktion wird nur überprüft, ob _from größer ist als _to, wenn ja, wird _to = _from zugewiesen.

Beim debuggen ist mir gerade etwas seltsames aufgefallen:

Wenn ich bei_to ein neues Datum ausewähle > _from funktioniert alles. Klicke ich dann auf _from um das Kalenderfeld zu bekommen wird der Eventhandler aufgerufen. Beim Debuggen sehe ich dann, das _from auf den letzten Tag des aktuellen Monats gesetzt wurde.

Kann sich jemand von Euch das verhalten erklären? Bin etwas ratlos.

Beide DTP werden nur mit dem einen Eventhandler verbunden (mach ich alles in meinem Quellcode, nicht von der IDE)

Beste Grüße

Solick

PS: Beim zuweisen der neuen Werte hänge ich die Eventhandler natürlich kurzzeitig aus...

31.08.2010 - 19:12 Uhr

Ich glaube das ist nicht das, was ich suche. Binding bindet ja Datenstrukturen, wie zb. DataSets etc. an ein Objekt.

Ich möchte eher sowas wie einen Event werfen. Hab da gerade was gefunden, werd aber noch nicht ganz schlau draus...

Controls mit Delegaten abbonieren...

Wenn ich es richtig vertstanden habe, baue ich eine Delegate-Methode in meine Controll-Klasse ein, die ich dann mit dem anderen Control abboniere. Hab ich das soweit richtig verstanden?

Grüße Solick

31.08.2010 - 18:34 Uhr

Hi,

hab mal eine grundsätzliche Frage:

Wie kann man das Eintreten eines Zustands / Ereignisses in einem Control von einem anderen Control abfangen?

Hintergrund:

Habe ein Control gebaut mit diversen Elementen, unter anderem eine Liste von Radio Buttons von denen immer nur einer selectiert ist. ein anderes Control soll etwas anzeigen, je nachdem welcher Radiobutton aktiv ist.

Beste Grüße

Solick

25.08.2010 - 11:06 Uhr

so hab jetzt alles hinbekommen, die Funktion sollte im Rahmen einer Abfrage für jede ID den Count machen und das macht sie jetzt.

Grüße

25.08.2010 - 10:27 Uhr

Hi,

nein es liegt an was anderem:

Hab es jetz so hinbekommen, allerdings liefert er dann eine Tabelle zurück. Ich hätte aber gerne einen Int-Wert zurück. Ich vermute, ich muss die Abfrage intern in eine Int-Variable zwischenspeichern und die dann zurückgeben, allerdings weiss ich gerade nicht so ganz, wie ich das am besten mache. Kann man eine Abfrage direkt convertieren? ich werd mal weiter probieren.

Und natürlich hatte ich mir die Syntax in der MSDN angeschaut...

USE [e3]
GO

/****** Object:  UserDefinedFunction [dbo].[getCount]    Script Date: 08/25/2010 10:24:20 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[getCount] (@project_id int)
RETURNS TABLE
AS
RETURN
(
   (SELECT 
   ((SELECT COUNT(*) FROM hf2_dat_persoenlich WHERE projekt_id = @project_id AND (datum BETWEEN  CONVERT(DATETIME, '2009-01-01 00:00:00', 102) AND  CONVERT(DATETIME, '2009-12-31 00:00:00', 102)))+ COUNT(*)) AS Menge
   FROM hf2_bewerber_geloescht WHERE hf2_bewerber_geloescht.id_projekt = @project_id AND (datum BETWEEN  CONVERT(DATETIME, '2009-01-01 00:00:00', 102) AND  CONVERT(DATETIME, '2009-12-31 00:00:00', 102)))

);

GO

so lässt sich die Funktion erstellen, nur beim Aufruf zickt er gerade noch aber das bekomme ich auch noch raus...

USE [e3]
GO

/****** Object:  UserDefinedFunction [dbo].[getCount2]    Script Date: 08/25/2010 10:37:52 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[getCount2] (@project_id int)
RETURNS Int
AS
BEGIN
	DECLARE @Return Int
/*SELECT @Return = COUNT(*) FROM hf2_dat_persoenlich WHERE projekt_id = @project_id*/

   SELECT @Return = (SELECT 
   ((SELECT COUNT(*) FROM hf2_dat_persoenlich WHERE projekt_id = @project_id AND (datum BETWEEN  CONVERT(DATETIME, '2009-01-01 00:00:00', 102) AND  CONVERT(DATETIME, '2009-12-31 00:00:00', 102)))+ COUNT(*))
   FROM hf2_bewerber_geloescht WHERE hf2_bewerber_geloescht.id_projekt = @project_id AND (datum BETWEEN  CONVERT(DATETIME, '2009-01-01 00:00:00', 102) AND  CONVERT(DATETIME, '2009-12-31 00:00:00', 102)))

RETURN @Return
END

GO



25.08.2010 - 09:57 Uhr

verwendetes Datenbanksystem: <MSSQL Server 2008 Express>

Hi,

bin leider nicht so firm in den T-SQL Dingen. Kann mir jemand sagen, warum ich eine Fehlermeldung in der Nähe von Return in Zeile 4 bekomme, wenn ich den Code ausführen will?

use e3
go
CREATE FUNCTION dbo.getCount (@project_id int)
RETURNS int
AS
RETURN
(
   (SELECT 
   ((SELECT COUNT(*) FROM hf2_dat_persoenlich WHERE projekt_id = @project_id AND (datum BETWEEN 2009-01-01 AND 2009-12-31))+ COUNT(*)) 
   FROM hf2_bewerber_geloescht WHERE hf2_bewerber_geloescht.id_projekt = @project_id AND (datum BETWEEN 2009-01-01 AND 2009-12-31))

);
go

Danke und beste Grüße

Solick

05.08.2010 - 15:02 Uhr

Hi,

danke für den Hinweis, werd mir das mal genauer anschauen...

Beste Grüße

Solick

23.07.2010 - 15:44 Uhr

Hi,

hab leider nicht gefunden, ob es eine Möglichkeit gibt, die Zeilen einer ComboBox zu formatieren.

Habe eine Combobox mit mehreren Zeilen und würde den Text gerne rechts ausrichten.

Lg Solick

14.07.2010 - 07:44 Uhr

Super jetzt gehts. Keine Ahnung warum vorher nicht. Hatte es so geschrieben. DAnke!

Gibts es da irgendwo ne Syntax zu dem Befehl? Kann man die Spaltennamen benennen?

BEste Grüße

Solick

13.07.2010 - 17:27 Uhr

Danke für den Hinweis, aber unter 2008 funktioniert die SP wohl nicht... jedenfalls gibt er mir einen Syntax Fehler aus.

Bei Oracle gibt es im INFORMATION_SCHEMA doch deutlich mehr INfos, wenn ich mich recht erinnere, auch die Anzahl der Datensätze konnte man dort auslesen.

Gibt es denn in T_SQL keine einfache Möglichkeit, sich alle Tabellen einer DB und die Anzahl der Datensätze anzeigen zu lassen?

Mit einer Function oder Stored Procedure müsste es ja gehen, aber da müsst ich mich erst wieder reinfummeln, dachte das geht was einfacher 😦

13.07.2010 - 14:07 Uhr

das verknüpfen in einer Abfrage.

Hab es schon probiert mit Ausdrücken wie:

SELECT * FROM (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES)

oder so ähnlich...

Mir fehlt gerade die Idee, wie ich die Tabellennamen auslesen kann und dann für jede Tabelle den Count erstellen kann...

13.07.2010 - 12:41 Uhr

verwendetes Datenbanksystem: <MSSQL Server 2008 Express>

Hallo,

ich wusste mal, wie ich das hinbekomme, hab mich aber schon länger nicht mehr mit komplexeren Abfragen beschäftigt. Ziel ist es, Alle Tabellen einer Datenbank mit der Anzahl der Datensätze anzuzeigen.

Mit SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

bekomme ich alle Tabellennamen.

Nun möchte ich für jede Tabelle einfach einen Count Befehl ausführen:

SELECT COUNT(*) FROM TABLE_NAME

Am Ende sollen dann zwei Spalten exisiteren in der Abfrage: Tabellen name und das Ergebnis von Count.

Da ich meine Unterlagen aus dem Studium damals nicht dabei habe und im Internet auch nicht richtig fündig geworden bin hoffe ich auf einen Tipp von Euch.

Beste Grüße

Solick

12.07.2010 - 17:32 Uhr

danke für den Hinweis. Ich hab mal das pooling ausgeschaltet und es scheint zu klappen.

Beste Grüße

Solick

12.07.2010 - 15:44 Uhr

verwendetes Datenbanksystem: <mysql 5.1>

Hallo,

ich greife von einer C# Anwendung regelmäßig Daten von einem MySQL Server im NEtz ab. Das hat bisher auch prima geklappt. Seit neuestem bekomme ich aber die Fehlermeldung, max_user_connections erreicht.

Vermutlich kommt es daher, dass ich im Rahmen des Syncronisationsprozesses mehrfach Objekte innerhalb von Objekten erstelle, und bei diesen ebenfalls auf die Datenbank zugreife. Allerdings schließe ich jedesmal mein MySQL-Objekt, mit dem ich die Verbindung herstelle.

Ich hab schon versucht, beim Kopierkonstruktor das connection Objekt mitzuübergeben, aber das hatte auch keinen Effekt.

Jetzt könnte ich natürlich den Wert erhöhen und mehr gleichzeitige Nutzer zulassen. Ich würde aber lieber die VErbindung beim close() definitiv lösen, das scheint aber nicht zu gehen, jedenfalls habe ich keine Methode gefunden. Dispose() dürfte dafür ja zu unsicher sein...

Hat jemand nen Tipp?

Beste Grüße

Solick

12.07.2010 - 15:39 Uhr

sorry für die späte Antwort. Hab es mit dem einfachen Alter Befehl dann doch hinbekommen, musste nur den Default-Wert vorher im Studio löschen...

28.06.2010 - 12:32 Uhr

verwendetes Datenbanksystem: <MS SQL Server 2008 Express>

Hallo, hab ein etwas blödes Problem. Leider muss ich bei einer Tabelle den Datentyp einer Spalte von Int auf float ändern. Die Tabelle ist auch schon mit Daten befüllt, daher kann ich sie nicht einfach neu anlegen.

Hat mir jemand einen Tipp, wie ich das am einfachsten bewerkstellige, mit dem SQL Studio geht es nämlich nicht, da weigert er sich die Änderung zu speichern, leider ohne weitergehenden Hinweis wieso.

Beste Grüße

Solick

08.06.2010 - 19:53 Uhr

Ich hab nochmal intensiv nachgedacht und bin darauf gekommen, dass ich ja auch ein eigenes UserControl bauen kann, dass dann alle Darstellungen so hat wie ich es mir wünsche. Werd es dann so versuchen...

Beste Grüße

Solick

08.06.2010 - 15:43 Uhr

Also aus der DataGridView Steuerung werde ich noch nicht so richtig schlau.

Hab jetzt mal folgendes zum Test gemacht:

Ein dgv mit 6 Spalten, die ersten drei als Combobox, der rest als Textbox.

Mittlerweile habe ich auch rausgefunden, dass man die einzelnen Zellen sozusagen rausholen und casten muss, um auf die Items zugreifen zu können.

Hab die Comoboxen jetzt testweise mit Daten befüllt.

Nun möchte ich gerne folgendes machen:

Wenn in der linken Combobox ein Eintrag ausgewählt wird, soll in der mittleren Combobox eine entsprechende Auswahl angeboten werden, wenn in der mittleren Combobox etwas ausgewählt wird, entsprechend die rechte Combobox befüllt werden.

Folgenden Code habe ich bisher:


private void Form1_Load(object sender, EventArgs e)
        {
            DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)dataGridView1.Rows[0].Cells[0];
            cell.Items.Add("Kunde 1");
            cell.Items.Add("Kunde 2");
            cell.Items.Add("Kunde 3");
            cell.Items.Add("Kunde 4");

            cell = (DataGridViewComboBoxCell)dataGridView1.Rows[0].Cells[1];
            cell.Items.Add("Projekt 1");
            cell.Items.Add("Projekt 2");
            cell.Items.Add("Projekt 3");
            cell.Items.Add("Projekt 4");
        }

Meine Idee war nun, bei Änderung eines Zelleninhalts das EVent abzufangen und entsprechend der Spalte zu befüllen.


private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            //MessageBox.Show(sender.ToString() + " Spalte: " + e.ColumnIndex + " - Zeile: " + e.RowIndex);
            if (e.ColumnIndex == 0)
            {
                DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)dataGridView1.Rows[0].Cells[1];
                cell.Items.Clear();
                cell.Items.Add("Projekt 2");
                cell.Items.Add("Projekt 3");
            }
            else if (e.ColumnIndex == 1)
            {
                DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)dataGridView1.Rows[0].Cells[2];
                cell.Items.Clear();
                cell.Items.Add("Leistung 1");
                cell.Items.Add("Leistung 2");
            }
                
            
        }

Leider führt er dass beim Aufbau jeder Zelle durch. Wie kann ich nur das Event einer Zelle abfangen, beispielsweise beim Ändern des Index der Combobox?

Danke und beste Grüße

Solick

08.06.2010 - 14:02 Uhr

Hallo,

erstmal vielen Dank für die schnellen Antworten:

Zum Entwicklerteam: ich 😃
Erfahrung mit WPF: Keine (Allerdings Webdesign Erfahrung, ist ja ein bischen ähnlich die Trennung von Form und Ihnhalt)

Der Code ist recht gut getrennt, es werden die meisten relevanten Aktionen in den Klassen verarbeitet, die ich geschrieben habe. Lediglich bei ein paar Fenstern werden Controls dynamisch erstellt.

Hab mir DataGridView gerade angeschaut und mal kurz einen Test gebaut. Kann man auch für die einzelnen Zellen Events auslösen oder geht das nur über den Zellen-Event des Grid und ich muss dann erstmal klären, welche Zelle das ist?

Wie ist denn generell Eure Einschätzung? Für welche Art von Projekten macht WPF Sinn und wann sollte man lieber bei WF bleiben?

Beste Grüße

Solick

08.06.2010 - 12:59 Uhr

Hallo,

ich entwickle eine Anwendung mit VS2008 Professional, bisher mit Windows Forms. Dioe Anwendung greift Daten von einem SQL Server 2008 Express ab. Die Daten sind sehr unterschiedlich, habe eine Reihe von Klassen in Bibliotheken, die entsprechend eingebunden sind.

Nun soll ich eine Tabelle mit diversen Eingaben ermöglichen, soweit ich recherchiert habe ist das mit Windows Forms nicht möglich (Tabelle, in der eine Zelle eine Combobox, die nächste ein Textbox, die übernächste eine Checkbox etc enthält), daher mein Interesse an WPF.

Nun meine Frage, ob es ratsam / möglich ist, das Projekt von Windows Forms zu WPF zu switchen. Gibt es veilleicht sogar einen Konverter? Hat jemand damit schon mal Erfahrung, wie groß der Auwand ist?

Beste Grüße

Solick

01.06.2010 - 18:08 Uhr

Hi,

ich hab mal eine Anleitung hier gepostet:

Schaust Du hier

Der Witz ist, dass Du die Bookmarks einzeln ansprechen musst. Schau Dir mal meine Foreach Schleife genauer an..

Grüße Solick

29.04.2010 - 08:52 Uhr

Hi,

danke für die Antwort. Bringt mich zum Grübeln...

Ich hatte die Max Pool Anzahl auf 200 erhöht, dann habe ich keine Timeouts mehr bekommen.

Warum ist das nicht ratsam, die Anzahl zu erhöhen bzw. welche Probleme könnte mir das bereiten?

BEste Grüße

Solick

28.04.2010 - 14:58 Uhr

verwendetes Datenbanksystem: <MS SQL Server 20098 Express>

Hallo,

schreibe an einer C# Anwendung, die auf einen MS SQL Server 2008 Expres zugreift (läuft auf einem zentralen Server im Netzwerk).

Nun habe ich beim Testen festgestellt, dass bei zu vielen Abfragen Timeouts vom Pool kommen. Anscheinend wird zu oft eine Verbindung aufgebaut.

Hintergrund: Ich habe komplexe Objekte, die Listen von Objekten enthalten, diese werden teilweise aus der DB generiert, und dabei kommt es beim Starten der Anwendung zu vielen Anfragen.

Meine Frage: Ist es sinnvoll, einfach nach jedem Close ClearAllPools() oder ClearPool aufzurufen, um den Pool zu leeren oder einfach den MAx Pool auf sagen wir 500 oder 1000 hochzusetzen?

Besten Dank und viele Grüße

Solick

25.03.2010 - 10:06 Uhr

Hallo Utobler,

also den kompletten Code nicht, der wäre auch zu lang, aber das Prinzip ist wie folgt:

In einer Wordvorlage Textmarken an den Stellen einfügen, an denn Sie benötigt werden, dann folgenden Code verwenden:



ApplicationClass _word;
Document _doc;
Table _table;


//Vorlage öffnen
_docname = "meineVorlage.dotx";

//Wordvorlage öffnen
//Word-Vorlage öffnen
Object oMissing = System.Reflection.Missing.Value;

 _word = new ApplicationClass();
 _word.Visible = true;
try
            {
                _word.Documents.Add(ref _docname, ref oMissing, ref oMissing, ref oMissing);
                _doc = _word.ActiveDocument;
                Bookmarks oBookmarks = _word.ActiveDocument.Bookmarks;
                Bookmark oBookmark = null;
                _table = null;
               
                Range oRange = null;
                Object oName = null;
                Object oRow = 1;
                Object oCol = 2;
                List<String> _bookmarklist = new List<string>();
                _bookmarklist.AddRange(new String[] {"Anrede","Vorname","Nachname","Firma","Strasse","PLZ","Ort","Tabelle"});
                
                               
                foreach (String s in _bookmarklist)
                {
                    try
                    {
                        if (oBookmarks.Exists(s))
                        {
                            oName = s;
                            //Bookmark wird überschrieben, existiert danach nicht mehr
                            oBookmark = oBookmarks.get_Item(ref oName);
                            oRange = oBookmark.Range;
                            if (s == "Anrede")
                            {
                                oRange.Text = "Herr";
                            }
                            else if (s == "Vorname")
                            {
                                oRange.Text = "Martin"
                            }
                            else if (s == "Nachname")
                            {
                                oRange.Text = "Mustermann";
                            }
                            else if (s == "Firma")
                            {
                                oRange.Text = "Beispielfirma";
                            }
                           else if(s == "Tabelle")
     {
     //Tabellen zeichen und nutzen:
     Int32 Rows = 9;
     Int32 Cols = 3;
     _table = _doc.Tables.Add(oRange, Rows, Cols, ref oMissing, ref oMissing);
     //Spalte 1 wird auf Breite 25 gesetzt
     _table.Columns[1].SetWidth(25,WdRulerStyle.wdAdjustFirstColumn);
     _table.Cell(1,1).Range.Text = "Hier kommt der Text für Zelle 1,1";

      }

      // Textmarke wieder zum Dokument hinzufügen
                            Object bookmarkRange = (object)oRange;
                            _word.ActiveDocument.Bookmarks.Add(s, ref bookmarkRange);

     }


catch (Exception e)
                    {
                        
                    }
finally
            {
                //Hier muss noch abgefangen werden, falls Word schon geschlossen wurde
                try
                {
                    _word.Quit(ref oMissing, ref oMissing, ref oMissing);
                }
                catch
                {
                }
            }

Hoffe, das Prinzip ist klar geworden. Mann kann auf nahezu alle Formatierungsmöglichkeiten zugreifen, die es in Word gibt. Die Interop-Bibliotheken sind da sehr umfangreich. Die Tabelle habe ich zum beispiel geschachtelt, Spalten verbunden, ausgerichtet etc...

Grüße Solick

22.03.2010 - 09:15 Uhr

Excel 2007 speichert grundlegend anders als Excel 2003. Versuch dich mal mit den Interop Bibliotheken zu beschäftigen, da kannst Du direkt in Excel arbeiten...

20.03.2010 - 16:51 Uhr

oder einfach try {} catch {} und dann die Exeption abfangen...