Kann ich das ggf. mit einer abstrakten Basisklasse lösen?
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
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
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
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
Hi herbivore,
ich probiere das heute nachmittag mal aus und gebe Bescheid wie es gelaufen ist.
Beste Grüße
Solick
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
Hi,
dazu müsste ich das Label ja ausserhalb des Controls zugänglich machen, das möchte ich aber nicht.
Grüße
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
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
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
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
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
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
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
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:
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
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...
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:
Kalender direkt ansprechen geht nicht, man kann zwar Farben etc. manipulieren, aber den Kalender direkt bekomme ich nicht in den Zugriff...
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
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...
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
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?
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...
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:
Ich initiierte die DTP manuell, also nicht mit der IDE... möglicherweise setzte ich eine Eigenschaft anders oder nciht, die die IDE automatisch setzt
Meine DTP sind Member einer List<DateTimePicker>
Jemand noch ne Idee, woran es liegen könnte?
Beste Grüße
Solick
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....
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...
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
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
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
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
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
Hi,
danke für den Hinweis, werd mir das mal genauer anschauen...
Beste Grüße
Solick
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
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
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 😦
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...
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
danke für den Hinweis. Ich hab mal das pooling ausgeschaltet und es scheint zu klappen.
Beste Grüße
Solick
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
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...
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
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
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
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
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
Hi,
ich hab mal eine Anleitung hier gepostet:
Der Witz ist, dass Du die Bookmarks einzeln ansprechen musst. Schau Dir mal meine Foreach Schleife genauer an..
Grüße Solick
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
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
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
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...
oder einfach try {} catch {} und dann die Exeption abfangen...