Laden...
S
Somakia myCSharp.de - Member
Data Analyst Specialist Hessen Dabei seit 08.09.2010 269 Beiträge
Benutzerbeschreibung

Forenbeiträge von Somakia Ingesamt 269 Beiträge

05.11.2012 - 20:54 Uhr

verwendetes Datenbanksystem: MSSQL

Hallo liebe myC#-Gemeinde,
ich arbeite gerade an einer ASP.Net-Webanwendung mit Datenbank-Zugriff.
Die Datenbank wird bei Start der Anwendung in 3 DataSets geladen, wobei sich im letzten DataSet "nur" 2 Sichten befinden. Diese Sichten wollen, wie normale DataTables in typisierten DataSets, zumindest soweit mir bekannt, ja auch gefüllt werden?! (Es handelt sich dabei ja auch nur um DataTables im DataSet)

Beide Sichten haben ihre TableAdapter.
Leider hat der TableAdapterManager dieses DataSets keine TableAdapter.

Hat jemand eine Ahnung...

  1. warum dem so ist?
  2. wie man den TableAdaptermanager (welche ja autogeneriert ist) dazu bringt, für die DataTables der Sichten ebenfalls TableAdapter zu "haben"?

so far
Karill Endusa

P.S:
Falls die Frage auftauchen sollte, warum ich den TableAdapterManager nutzen will: In den anderen beiden DataSets habe ich den TableAdapterManager über partial so erweitert, dass die einzelnen TableAdapter der Tabellen dort schon instanziiert werden. Das spart in der eigentlichen DataAccess-Klasse Code beim Erstellen und Befüllen der DataTables und steigert die Lesbarkeit des Codes (Da ich nun nicht für jede Tabelle ein eigenes TableAdapter-Objekt definieren und verwalten muss)

05.11.2012 - 08:51 Uhr
  1. Entschuldigt die lange Wartezeit bis zu meiner Antwort, ich bin immer nur Montags bis Mittwochs auf Arbeit 😃

  2. @Programmierhans
    Genau das war mein Problem: Ich habe zwar der drSQL_SD.SD_DokartRow eine eine DataRow hinzugewiesen, intern wird diese dann aber über die Datensatz-ID referenziert. Beim TableAdapter.Update() werden die ID's neu vergeben (auto-increment feld) und dadurch geht die Referenz flöten (in der drSQL_SD steht immer noch die alte DokArt-ID drin).
    Ich guck mir das mit dem Weitergeben von Änderungen nochmal an, auch wenn ich das aktuell anders gelöst habe... wenngleich unweit komplizierter mit unnötigem Arbeitsaufwand.
    Vielen Dank an dieser Stelle.

@vbprogger
a: Ja, ich führe ein Transaction.Commit ohne Prüfung aus... das Programm befindet sich ja aber auch noch in Entwicklung, diese Vorgehensweise wurde schon wieder abgeändert.
b: ein try-catch ist vorhanden, jedoch nicht in meinem geposteten Beispiel, da dieses nur einen kleinen Ausschnitt aus dem gesamten Prozess zeigt.
c: es kam zu keiner Exception, weder an dieser Stelle noch vorher. Mein Debugger steht bei solchen Entwicklungen vor den abschließenden Tests eh immer auf "Bei Auftreten einer Exception sofort anhalten".
Danke trotzdem für die Gedanken die du dir zu meinem Problem gemacht hast.

so far
Karill Endusa

31.10.2012 - 12:18 Uhr

verwendetes Datenbanksystem: Access/MSSQL

Hallo liebe myC#-Com,
ich hänge grad an einem Problem bei der Datenmigration von Access nach MSSQL.
Mir geht beim Update einer Child-Tabelle leider der Verweis zur Child-Row in der Parent-Tabelle verloren. Ich gehe bei den betroffenen Tabellen wie folgt vor:

//Schritt 1: Datenmigration von AccessDataSet nach MSSQLDataSet
DataSets.MSSQLDataSet.SD_DateiRow drSQL_SDDatei = null;
DataSets.MSSQLDataSet.SD_DokartRow drSQL_SDDokart = null;
DataSets.MSSQLDataSet.SDRow drSQL_SD = null;
foreach(DataSets.AccessDataSet.SDRow drMDB in dsMDB.SD.Rows)
{
	try
	{
		//Schritt 1.1: Ermittlung der Child-Rows
		drSQL_SDDatei = (DataSets.MSSQLDataSet.SD_DateiRow)dsSQL.SD_Datei.Select(dsSQL.SD_Datei.IDColumn.ColumnName + "=" + drMDB.Datei_ID)[0];
		drSQL_SDDokart = (DataSets.MSSQLDataSet.SD_DokartRow)dsSQL.SD_Dokart.Select(dsSQL.SD_Dokart.IDColumn.ColumnName + "=" + drMDB.Dokart_ID)[0];
		
		//Schritt 1.2: Erstellung einer neuen SD-Row
		drSQL_SD = dsSQL.SD.NewSDRow();
		
		//Schritt 1.3: Wertezuweisungen
		//(...)
		
		//Schritt 1.4: Zuweisen der Child-Rows
		drSQL_SD.SD_DateiRow = drSQL_SDDatei;
		drSQL_SD.SD_DokartRow = drSQL_SDDokart;
		
		//Schritt 1.5: Row hinzufügen zu DataTable
		dsSQL.SD.AddSDRow(drSQL_SD);
	}
	catch(Exception ex)
	{
		MessageBox.Show(ex.Message);
	}
}

//Schritt 2: Update Tabelle SD_Datei
tamSQL.SD_DateiTableAdapter.Transaction = tamSQL.SD_DateiTableAdapter.Connection.BeginTransaction();
tamSQL.SD_DateiTableAdapter.Update(dsSQL.SD_Datei);
tamSQL.SD_DateiTableAdapter.Transaction.Commit();

//Schritt 3: Update Tabelle SD_Dokart
tamSQL.SD_DokartTableAdapter.Transaction = tamSQL.SD_DokartTableAdapter.Connection.BeginTransaction();
tamSQL.SD_DokartTableAdapter.Update(dsSQL.SD_Dokart);
tamSQL.SD_DokartTableAdapter.Transaction.Commit();

//Schritt 4: Update Tabelle SD
tamSQL.SDTableAdapter.Transaction = tamSQL.SDTableAdapter.Connection.BeginTransaction();
tamSQL.SDTableAdapter.Update(dsSQL.SD);
tamSQL.SDTableAdapter.Transaction.Commit();

tamSQL ist ein TableAdapterManager
In Schritt 3 liegt der Hase im Pfeffer begraben, denn nach dem Update der Tabelle dsSQL.SD_Dokart ist plötzlich bei jeder DataSets.MSSQLDataSet.SDRow die .SD_DokartRow = null... dadurch stimmen die .Dokart_ID der einzelnen Zeilen nicht mehr und es kracht beim INSERT in der Datenbank.

Ich freue mich über jegliche Tips und Anregungen die zur Problemlösung beitragen (hauptsächlich: Warum ist der Verweis auf die Zeile plötzlich "null")

P.S.: Der Verweis auf die SD_Datei-Row bleibt korrekt bestehen.

29.10.2012 - 13:42 Uhr

Zusätzlich zur Aussage von MrSparkle:
Aus meiner Sicht wäre eine Abfrage auf arr.Contains(true); doch sogar einfacher als eine Lösung via IndexOf()?!

24.10.2012 - 13:23 Uhr

sollte die Funktion in C++ nicht wie folgt aussehen?:

extern "C" __declspec(dllexport) bool __stdcall Funktion(){
...
}

Zumindest, soweit ich das gelernt hab...
Nachzulesen auch auf CodeProject: Using Unmanaged code and assembler in C#

25.09.2012 - 15:49 Uhr

Das ganze ist hier ein wenig tricky.
Die DataGridViewCell-Klasse selbst hat keine Eigenschaft für eine (Hintergrund-)Farbe, jedoch eine Style-Eigenschaft (vom Typ "DataGridViewCellStyle").
Ein DataGridViewCellStyle hat eine Eigenschaft "BackColor". Damit solltest du zum gewünschten Ergebnis kommen.

Verweise:
MSDN - DataGridViewCell.Style
MSDN - Eigenschaften von DataGridViewCellStyle

22.08.2012 - 10:29 Uhr

Dafür gibt es ja die fangenden Gruppen (die runden Klammern 😉).
Match.Groups-Eigenschaft

22.08.2012 - 10:21 Uhr

Hätte ich wie folgt gelöst

Status\sof\sthe\sdisk\s([a-fA-F0-9]{2}.[a-fA-F0-9]{2}).+?\sis\smissing\sthe\sdisk Voraussetzung ist, dass diese Reihenfolge gleich bleibt.
Ich habe eben die fangende Gruppe auch noch um den gesamten Wert den du brauchst gelegt anstatt um beide Einzelwerte. Wenn du wieder beide Einzelwerte haben will, musst du halt die Klammern für fangende Gruppen an der Stelle anpassen.

Würdest du den RegEx mit (?i) auf case-insensitive stellen könntest du dir bei den Klassen noch ein wenig Arbeit ersparen:

(?i)Status\sof\sthe\sdisk\s([A-F0-9]{2}.[A-F0-9]{2}).+?\sis\smissing\sthe\sdisk

(P.S.: Ja, ich weiß, dass "\s" nicht nötig ist, aber ich benutze es trotzdem gerne...)

21.08.2012 - 11:40 Uhr

Ohne genaueres Wissen um dein Programm lässt sich nur spekulieren.
Ginge man davon aus, du nutzt das WebBrowser-Control von WinForms, wäre folgender Ansatz vllt. hilfreich:

oIE.Document.GetElementsByTagName("form")[0].GetElementsByTagName("input")[2].InvokeMember("click");

Anmerkung: oIE ist das Webbrower-Control-Objekt.
Es wird in diesem Beispiel davon ausgegangen, dass das Formular das erste Formular des HtmlDocument ist und dass der Submit-Button das 3. Input in diesem Formular ist!

Andererseits musst du auch nicht direkt auf den Button klicken lassen, denn für Formulare ginge auch .InvokeMember("submit");

15.08.2012 - 16:08 Uhr

Ich hab das mal eben ausprobiert:

class HighButton : System.Windows.Forms.Button
{
	public HighButton()
	{
		this.Size = new System.Drawing.Size(100, 30);
	}
}

Ziehe ich dieses Control nun auf eine Form, hat es eine Höhe von 30.
Ich hoffe, ich hab jetz nix falsch verstanden, aber das ist doch das, was du erreichen möchtest, oder etwa nicht?

26.07.2012 - 16:47 Uhr

Das Problem hier ist, so nehme ich an, dass es sich bei dem Bild im genannten image container ja um ein BitmapImage-Objekt handelt, welches nicht einfach (so hab ich das zumindest in Erinnerung) mal eben in ein System.Drawing.Bitmap gewandelt werden kann.

Sollten bis hier meine Vermutungen stimmen, so habe ich folgendes Quelltext-Snippet gefunden:

BitmapImage bitmapSource;

using(MemoryStream outStream = new MemoryStream())
{
      BitmapEncoder enc = new BmpBitmapEncoder();
      enc.Frames.Add(BitmapFrame.Create(bitmapSource));
      enc.Save(outStream);
      System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(outStream);
}

(Quelle: social.msdn.microsoft.com - Bitmap<->BitmapImage conversion)
hoffe, dass das weiterhilft

so far
Karill Endusa

26.07.2012 - 13:14 Uhr

Hallo liebe myCSharp-Community,

mitlerweile konnte ich das Problem beheben. Ich kann mir zwar nicht erklären, warum eine Änderung der Projektmappe den Fehler immer wieder "umgehen" konnte, aber die eigentliche Fehlerquelle lag an ganz anderer Stelle.

Der Namespace-Name hat sich während der Entwicklung des InteropUserControls einmal geändert. Die Control-Klasse hatte daher noch ein ComSourceInterfaces-Attribut welches auf ein nicht existierendes Interface verwiesen hat (was die Fehlermeldung ja irgendwie auch aussagt). Es musste also nur das Attribut

[ComSourceInterfaces("<alter Namespacename>.__InteropUserControl")]

geändert werden in

[ComSourceInterfaces("<neuer Namespacename>.__InteropUserControl")]

Trotzdem Danke an Alle, die sich zu meinem Problem Gedanken gemacht haben 😃

so far
Karill Endusa

23.07.2012 - 11:57 Uhr

Hallo liebe myCSharp Community,

ich erstelle zur Zeit ein InteropUserControl mit dem VB6 - C# Interop Form Toolkit.
In der gleichen Projektmappe befindet sich noch ein WinForms Projekt zum Testen des Controls, wobei es keine Änderung mit sich bringt, wenn ich das Projekt aus der Mappe entferne.
Wenn ich Änderungen am InteropUserControl vornehme, bekomme ich beim "Erstellen" oder beim "Neu erstellen" immer folgende Fehlermeldung:> Fehlermeldung:

Die (Pfad zur InteropUserControl DLL)-Assembly kann nicht registriert werden. Der Typ "(Name des InteropUserControls).__InteropUserControl" in der Assembly "(Name des InteropUserControls), Version=1.0.4587.19489, Culture=neutral, PublicKeyToken=null" konnte nicht geladen werden. Hinweis: Aus betrieblichen Gründen Projektname und Pfad zur Assembly entfernt.
Hinweis 2: Die Versionsnummer des "Typs" steigt bei jedem Versuch und bei jedem Erstellen.
Wenn ich jetzt eine Änderung an der Projektmappe vornehme, zum Beispiel das WinForms-Prjekt entlade, kann ich Erstellen (es kommt keine Fehlermeldung mehr).

Ums deutlicher zu machen:
Erstellen -> Fehler -> WF-Projekt entladen -> Erstellen geht
WF-Projekt entladen -> Erstellen -> Fehler -> WF-Projekt neu laden -> Erstellen geht

Die Reihenfolge ist somit irrelevant... ich muss erst Erstellen damit der Fehler kommt und wenn ich nachdem der Fehler aufgetreten ist eine Änderung an der Projektmappe vornehme kann ich wieder Erstellen.

Ich habe mir mitlerweile als Notlösung ein Dummy-Projekt in der Projektmappe erstellt, welches ich zum Erstellen eben einfach laden bzw. entladen kann, damit ich dem WinForms-Projekt nicht immer neu sagen muss, dass es das Startprojekt ist... aber das kann doch hier nicht die Lösung sein?

P.S.: Es ist nicht das erste InteropUserControl welches ich so erstelle, aber das erste mal, dass es zu diesem doch recht merkwürdigen verhalten kommt.

22.07.2012 - 17:32 Uhr

Du könntest eine maximierte Form erstellen welche keinen Ramen hat und als TransparencyKey die gleiche Farbe wie als Hintergrundfarbe... darauf kannst du wild herumzeichnen wie es dir gefällt.
Wenn du diese Form dann noch auf TopMost = true schaltest sollte es (hoffentlich) das sein, was du suchst 😃

18.07.2012 - 12:18 Uhr

Ich kenne die WPF Collection View nicht, rate aber unter WinForms von der Verwendung der ListView für diesen Zweck ab.
Verwende stattdessen lieber das mächtigere DataGridView. Durch kleinere Anpassungen der Optik über die Properties kann man dieses wenn nötig auch wie eine ListView aussehen lassen.

Über die DataSource-Eigenschaft solltest du dann ohne größere Probleme deine Collection an das DataGridView binden können.

10.07.2012 - 16:34 Uhr

Asche auf mein Haupt, zig mal gemacht und doch nicht dran gedacht.

Aber damit sollte es auch dann mit Process via C# gehen 😃

10.07.2012 - 15:53 Uhr

Wenn es dir darum geht, die COM-DLL beim Kunden zu registrieren, sollte folgender Code vollkommen ausreichen:

/// <summary>
/// Registriert eine COM-Dll
/// </summary>
/// <param name="comDll">Kompletter Pfad zur DLL-Datei</param>
public void RegisterComDll(String comDll)
{
	Process proc = new Process();
	proc.StartInfo.FileName = "regsvr32.exe";
	proc.StartInfo.Arguments = comDll;
	proc.StartInfo.UseShellExecute = false;
	proc.StartInfo.CreateNoWindow = true;
	proc.StartInfo.RedirectStandardOutput = true;
	proc.Start();
	proc.WaitForExit();
	proc.Close();
}

Quelle: Register and Unregister COM DLLs from C# : CSharper
Dort wird auch eine weitere Möglichkeit genannt, wie man eine COM-Dll via P/Invoke registrieren könnte.

06.07.2012 - 13:45 Uhr

Selbst wenn könnte man im Nachhinein, also zum Beispiel im DataBindingComplete-Event, die Reihenfolge der Spalten wieder ändern dank MSDN - DataGridViewColumn.DisplayIndex-Eigenschaft

05.07.2012 - 13:51 Uhr

Hallo liebe myCSharp-Com,

in einer ASP.NET (nicht MVC) Anwendung ist mir letztens ein recht komisches und vor allem nicht nachvollziehbares Verhalten aufgefallen.
Wenn man ein Formular via Betätigung der Enter-Taste auslöst (defaultButton wird via JavaScript geklickt), sind einige Links nach dem Postback zuerst einmal nicht bedienbar (sie reagieren weder auf normales Klicken noch auf einen Rechtsklick (soll heißen, es öffnet sich auch kein Kontextmenü)).
Erst wenn man irgenwoanders auf der Seite hingeklickt hat sind die Links wieder nutzbar. Betroffen sind alle Links, welche javascript:__doPostBack() aufrufen (bei anderen Links ist es bisher nicht zu diesem Verhalten gekommen).
Bisher konnte ich dieses Verhalten jedoch nur im Internet Explorer 9 feststellen, sowohl IE8 als auch Firefox funktionieren dahingehend einwandfrei.
Weiterhin interessant ist auch, dass es nicht dazu kommt, wenn man vor dem Absenden des Formulars mit der Enter-Taste einen Teil der Eingabe in einem Input (z.B. einem Textfeld) vorher mit der Maus oder der Tastatur markiert.
Weiterhin kann man nach dem PostBack des Formulars kein Element der Webseite mehr über die Tab-Taste erreichen (es werden immer nur GUI-Elemente des IE angewählt, also die Adressleiste etc.).
Der Cursor-Fokus verbleibt auf der zuletzt ausgewählten Textbox (man sieht den Cursor dort blinken), aber verschiebt man den Webseitenausschnitt über die Scrollbalken so bleibt der Cursor nicht im Eingabefeld sondern wandert quasi mit (bzw. bleibt optisch gesehen an Ort und Stelle von den Bildschirmkoordinaten her gesehen).

Die bisher einzigste Lösung die ich gefunden habe ist der Kompatibilitätsmodus des IE, aber das kann doch nicht das Allheilmittel der Wahl sein?

Ich hoffe, hier ein par Ideen und/oder Anregungen zur Eliminierung dieses Verhaltens bekomme.

so far
Karill Endusa

//EDIT mitlerweile hat ein Update des AjaxControlToolkits den Fehler beheben können. Danke an all diejenigen, die sich Gedanken zu meinem Problem gemacht haben.

05.07.2012 - 13:29 Uhr
  • 3-6 Tassen an einem Arbeitstag, je nach Hungergefühl (ich esse meist erst abends was und Kaffee hilft da auch ein bisschen)
  • ja, schmeckt mir persönlich nicht wirklich 😃
05.07.2012 - 11:36 Uhr

Hallö,

auch ich bin eigentlich kein Fan von bitteren/herben Speisen/Getränken, aber ohne mein Koffein und Zucker überleb ich den Arbeitstag einfach nicht. Da Kaffee auf Arbeit hier nunma kostenfrei zur Verfügung gestellt wird, habe ich mir angewöhnt, diesen zu trinken... mit viel Zucker (5 Würfel) und viel Kaffeesahne (1/3 Tasse)...

Also: Kaffeeversorgung am Arbeitsplatz ist gewährleistet 😃

@herbivore: Mein schlimmstes Erlebnis war da eher ne LAN-Party... nach über 72 Stunden wach sein vergisst man gut und gerne auch mal den Filter ^^

13.06.2012 - 14:48 Uhr

Ich denke die einfachste Variante das Gewünschte zu erreichen wäre der Weg über die Ticks-Property (o.Ä.)

int multiplier = 5;
TimeSpan multipliedTimeSpan = TimeSpan.FromTicks(originalTimeSpan * multiplier);

Wenn du den original-TimeSpan-Wert nicht mehr brauchst, kannst du natürlich auch direkt den neuen Wert darin speichern.

Lösung gefunden auf folgender Seite:
BlackWasp - TimeSpan Multiplication and Division

13.06.2012 - 14:28 Uhr

Du sagst zwar (leider) nirgendwo, was genau für ein Control Favorites_StripDownButton ist, aber anhand der Bezeichnung gehe ich mal von ToolStripDropDownButton aus.
Dieses hat keine SelectedItem-Property, das stimmt, aber über das ToolStripDropDownItem.DropDownItemClicked-Ereignis kommst du über die ToolStripItemClickedEventArgs an das Item (e.ClickedItem) und darüber auch an den Text (e.ClickedItem.Text).

Lösung gefunden auf folgender Seite:
vbforums.com - [RESOLVED] How to get the selected index of a ToolStripDropDownButton?
Vorgang von mir nicht getestet.

13.06.2012 - 09:12 Uhr

Ich habe möglicherweise vergessen zu erwähnen:
Die Selektion selbst stößt noch nicht die eigentlich Verarbeitung an sondern nur eine Auswahl von Werten in 2 anderen ComboBox-Controls. Es kann hierbei vorkommen, dass in einer der beiden anderen ComboBoxen ein Wert nicht vorhanden ist, welcher ausgewählt werden soll. In diesem Fall gibt es eine entsprechende Meldung. Wenn ein Wert nicht vorhanden ist, wird die erste ComboBox auch wieder zurückgesetzt, was die vorherige Selektion komplett aufhebt und der Benutzer müsste die Auswahl von Vorne beginnen.

Außerdem verstehe ich unter "blättern" wirklich das durchgehen der offenen ComboBox mit Pfeiltasten, was aus meiner Sicht aber noch nicht der Neuauswahl eines Eintrages gleichkommt.

Das "Problem" mit der MessageBox lässt sich aktuell elegant über einen Tooltip lösen, welcher auch direkt bei der ComboBox aufploppt, in welcher der Wert nicht gefunden werden konnte, welcher ausgewählt werden sollte...

//EDIT:
Ich habe mich jetzt dafür entschieden, die ComboBox erst im SelectedIndexChanged einer der beiden anderen ComboBoxen zu zurückzusetzen (wenn der Benutzer die Auswahl geändert hat).

Ich danke Allen, die sich mit dem Thema befasst haben.

12.06.2012 - 15:52 Uhr

Hallo liebe myC#-Com,

ich stehe aktuell vor folgendem Problem:
In einer Anwendung nutze ich die RadDropDownList für WinForms von Telerik. Bei dieser ist als AutoCompleteMode SuggestAppend aktiviert.
Wenn nun der Benutzer anfängt, dort Daten einzugeben, und dann mit den Pfeiltasten durch die Vorschläge navigiert, wird das SelectedIndexChanged-Event ausgelöst.
Ich möchte bzw. muss irgendwie verhindern, dass es dazu kommt. Das Event darf nur ausgelöst werden bei einem Klick auf Enter (oder Tab), aber auf keinem Fall beim Navigieren durch die Vorschläge (wobei sich das eh meiner Logik entzieht, denn wenn man die Vorschläge "durchblättert" hat man noch keinen Eintrag ausgewählt...).
Hintergrund: Im SelectedIndexChanged Event werden anhand des ausgewählten Eintrags Daten aus einer Datenbank ausgelesen und mit vorher geladenen Daten aus verschiedenen Tabellen verglichen. Wenn es dabei zu einem Fehler kommt wird eine Meldung angezeigt in Form einer Messagebox (und ja, ich weiß dass modale Dialoge "out" sind, aber das ist hier in diesem Fall nunmal eine Vorgabe) und der Benutzer wird daran gehindert, weiterhin durch die Vorschläge zu "blättern". Außerdem muss ich nicht unbedingt jedes mal nur weil der Benutzer die Vorschläge durchsucht auf die Datenbank zugreifen...

Meine erste Idee war, nicht das SelectedIndexChanged sondern das KeyDown-Event zu verarbeiten... wenn ich dennoch das SelectedIndexChanged nutzen könnte, fänd ich jedoch schöner (und es würde m.M.n. schlichtweg besser passen).

Ich hoffe, jemand hat eine Idee... (oder sagt mir, ich solls besser wirklich über KeyDown machen)...

so far
Karill Endusa

//EDIT wobei sich beim KeyDown das Problem ergibt, dass es nur gefeuert wird, wenn ich einen Vorschlag selectiert habe, also wirklich die DropDownList wieder den Fokus hat und nicht ihre Vorschlagsanzeige

11.06.2012 - 09:45 Uhr

Da sich die Config-Datei bei einem Update des Programms ja auch ändern kann, wäre es in diesem Fall besser, die vordefinierten Methoden für ein Upgrade der Configuration zu benutzen:

if(Properties.Settings.Default.UpgradeRequired)
{
	Properties.Settings.Default.Upgrade();
	Properties.Settings.Default.UpgradeRequired= false;
	Properties.Settings.Default.Save();
}

//Hinweis: UpgradeRequired ist eine selbst erstellte Einstellung, bool, Standardwert: true.

06.06.2012 - 13:09 Uhr

Das mit dem Move Ereignis kann ich nicht machen, da sich meine Anwendung von meinem externen Programm so gesehen verschieben lässt, da es sich an diese externen Koordinaten orientiert.

Was aber auch kein Hindernis darstellen sollte:
Du kannst, wenn du dein eigenes Fenster verschieben willst, die Move(/LocationChanged)-Events vorrübergehend deregistrieren oder du nutzt eine Flag die angibt, dass das Fenster jetzt programmatisch verschoben wird und prüfst innerhalb der EventHandler auf dieses Flag.

//EDIT
Wusst ichs doch, dafür gibts sogar ne FAQ: [FAQ] Event nur bei Benutzeraktion auslösen, nicht bei programmtechnischer Änderung

30.05.2012 - 12:20 Uhr

Ich kann mich hier auch nur der Aussage von Sarc anschließen:
Ich verstehe ebenfalls nicht, was die "+" dort eigentlich verloren haben sollen.
Wenn es dafür eine vernünftige Erklärung gibt, so bitte ich hier um diese, ansonsten würde ich einfach mal sagen, dass dort dein Fehler liegt.

30.05.2012 - 10:18 Uhr

Ich würde meinen, wobei das jetzt ungetestet ist, es sollte ausreichen, das IEquatable Interface zu implementieren und die Equals-Methode zu überschreiben. In dieser musst du dann nur auf Gleichheit der Name-Property überprüfen.

Hinweis: Dieser Lösungsansatz entstand aus der Tatsache, dass man auf diesem Weg bei einer List<T> mit eigenen Objekten mit der Contains-Methode überprüfen kann, ob das Objekt (bzw. hier ein Objekt mit gleichem Wert in der Name-Property) schon vorhanden ist.

29.05.2012 - 14:09 Uhr

@BerndFfm: Danke für den Hinweis, da müsst ich mal mit meinem Ausbilder eine Diskussion führen zu dem Thema

@Khalid:
Bei der Spaltendefinition handelt es sich Serverseitig um ein nvarchar(32), in der DataColumn der DataTable im DataSet steht der DataType auf System.String und MaxLength steht auf 32.
//EDIT: Ich habe mir heute noch mal die Parameterdefinitionen des InsertCommand vom Table-Adapter angesehen, diese standen doch tatsächlich auf WChar. Ich frag mich zwar weiterhin, wie es überhaupt dazu gekommen ist (Anfangs ging der Import über genau diesen TA noch problemlos), bin aber erst einmal erleichtert, des Rätsels Lösung gefunden zu haben.

Ich habe Testweise mal den InsertCommand des TableAdapter kopiert und manuell im Quelltext via OleDbConnection und OleDbCommand den Befehl an die Datenbank abgesetzt, da sind dann keine füllenden Leerzeichen in den erwähnten Zellen.

so far,
Karill Endusa

29.05.2012 - 12:52 Uhr

verwendetes Datenbanksystem: MsSql 2008 (Express)

Hallo myCSharp-Com,
Ich habe ein Problem beim Insert von Datensätzen in eine Tabelle in einer MSSQL-Datenbank.
Ich habe ein DataSet mit DataTable und dazugehörigem TableAdapter und führe über diesen TableAdapter einen Insert aus.
Dabei werden auf mir unerklärliche Weise noch in einigen Zellen zusätzliche Leerzeichen hinter dem Wert eingefügt.
Durch Auswerten dieser Zellen bin ich zumindest schonmal zu der Erkenntnis gelangt, dass die Zellen bis zum MaxLength-Wert (wie er bei der Spalte (DataColumn) in der DataTable steht) aufgefüllt werden, aber das ist ja eigentlich nicht Sinn dieser Angabe?!

Hat jemand eine Idee, woran das liegen könnte, und was ich ändern könnte/müsste, damit die Werte ohne die zusätzlichen Leerzeichen eingetragen werden?

so far,
Karill Endusa

29.05.2012 - 12:35 Uhr

Du könntest auch von den generierten Controls die Events abfragen...
Einfach eine eventhandler methode für das verschieben von Controls erstellen, bei allen generierten Controls die verschiedenen MouseEvents auf deine Methoden registrieren (+=) und den sender auf Control casten... damit hast du dann das Control welches mit der Maus bewegt werden soll!

22.05.2012 - 14:34 Uhr

Damit ist die Windows-Umgebungsvariable PATH bzw. %PATH% gemeint.
Unter XP findest man diese Einstellungen zum Beispiel unter:
Systemeigenschaften (Start -> rechtklick auf Arbeitsplatz -> Eigenschaften) -> Reiter "Erweitert" -> Knopf "Umgebungsvariablen"
Programme/Dateien in einem Ordner, welcher sich in dieser Umgebungsvariablen PATH befindet, können ohne vollstände Pfadangabe angesprochen werden.
(Deswegen kann man über Start -> Ausführen die Windows-"Systemprogramme" z.B. alle direkt über den Namen starten, wie "cmd", "calc" oder "notepad")

22.05.2012 - 11:15 Uhr

Folgendes Meta-Tag weist den Explorer (IE) an, immer mit der aktuellsten "Version" zu arbeiten... das sollte dein Problem lösen:

<meta http-equiv="X-UA-Compatible" content="IE=edge"/>

Quelle: Internet Explorer Kompatibilitätsansicht verhindern › Der Blog von Benny Neugebauer

21.05.2012 - 12:50 Uhr

Zu (1) (und mgl. auch (3)):
Die Standard-Einstellungen für den Erststart kann man ja auch im Einstellungsfenster einrichten (In der Spalte "Wert").
Wenn du danach einen Blick in die Datei Settings.Designer.cs wirfst (zu finden unter Properties -> Settings.settings im Projektmappen-Explorer), siehst du, dass die Einstellungen, welchen du schon einen Wert zugewiesen hast, ein DefaultSettingValueAttribute() besitzen, in welchen dieser Wert drin steht.
Soll heißen: Die Werte stehen Anfangs fest im Programmcode!

14.05.2012 - 13:54 Uhr

Wie sieht denn deine PostMessage eigentlich aus?
Die Struktur welche ich auf PInvoke.Net finde ist leicht anders:pinvoke.net: PostMessage (user32)

Wenn du auch mit P/Invoke arbeitest, was ich bei PostMessage einfach mal annehme:
PostMessage gibt einen boolschen Wert zurück, ob es geklappt hat oder nicht. Bei false könnte man mit Marshal.GetLastWin32Error(); zum Beispiel dann noch gucken, woran es hapert. (Siehe Beispiel auf pinvoke.net)

P.S.: Ein gutes Beispiel zur Verwendung von PostMessage wie es bei pinvoke.net definiert ist ist hier zu finden: thejaeck.net - PostMessage in C#

07.05.2012 - 12:16 Uhr

Mir fällt aktuell nur eine Möglichkeit ein, und das wäre das Erstellen einer eigenen CheckBoxColumn wo du im EditingControl das OnCheckedChanged Event der CheckBox überschreibst und dabei den Wert direkt in die Zelle schreibst:

if(EditingControlDataGridView != null)
{
	EditingControlDataGridView.CurrentCell.Value = this.Checked;
}

(das EditingControl leitet dabei von CheckBox und IDataGridViewEditingControl ab, this.Checked bezieht sich also auf die .Checked-Property der Checkbox)

Zusatzinfo:
EditingControlDataGridView ist eine Property von IDataGridViewEditingControl

07.05.2012 - 11:36 Uhr

Die Fehler aus dem Screenshot sagen doch, wo es hapert:
Du versuchst in Zeile 44 auf die Columns-Property deines DataGridViews wie eine Methode zuzugreifen. (In Zeile 46 ein ähnlicher Fehler)

VB verhält sich bei Collection-/Array-Zugriffen ein wenig anders was die Zeichen angeht.
Auf eine Spalte über den Index/Namen zugreifen geht in C# über die eckigen Klammern, nicht über die Runden 😉

mitgliederDataGridViewAnzeige.Columns["DataGridViewTextBoxColumn9"].Index
24.04.2012 - 11:44 Uhr

Zum Nachsehen, ob irgendwelche DLL's nicht gefunden werden, benutze ich ganz gerne den Dependency Walker

23.04.2012 - 14:38 Uhr

Befinden sich in beiden Listen die gleichen Objekte oder nur Objekte welche bei .ToString() das gleiche Ergebnis liefern würden, welche aber nicht wirklich gleich sind?

Wenn es dir darum geht, den Index auszulesen, warum nutzt du dann nicht List<T>.IndexOf(T)?
Um nun wieder auf meine Eingangsfrage zurückzukommen: Wenn es nicht wirklich die gleichen Objekte sind, bringt IndexOf erst einmal nicht viel! Jetzt ist es aber ein Leichtes, das System.IEquatable<T> -Interface zu implementieren und die Equals-Methode() so umzuschreiben, dass sie einen Vergleich der beiden T.ToString()-Strings durchführt. Jetzt kann man auch getrost IndexOf benutzen.

so far
Karill Endusa

13.04.2012 - 15:20 Uhr

Ich würde die gleiche Vorgehensweise (For-Schleife) nutzen.

Was das Array angeht:
Dictionary oder eine Liste von KeyValuePair bietet sich meiner Meinung nach eher an.

13.04.2012 - 08:46 Uhr

Wenn es um den FireFox-Browser geht so sollte auch das Plugin MozRepl nicht unerwähnt bleiben.
Dieses Plugin lässt sich via TCP/IP ansprechen (es startet einen Server) und der FireFox lässt sich anschließend über JavaScript-Befehle steuern.
Um sich nicht alles selbst erarbeiten zu müssen, also welche Befehle man für welche Wirkung absetzen muss, kann man sich solche Informationen aus der FF.au3 (Dies ist eine UDF für die Scriptsprache AutoIt) holen.
(Wenn es den Kunden und dich nicht stört, wäre es bei der Verwendung von MozRepl aber dann wahrscheinlich einfacher, gleich die Anwendung in AutoIt zu entwicken?)

so far
Karill Endusa

12.04.2012 - 12:45 Uhr

Oder meinst du gar, dass du dein C#-Programm Pluginfähig machen willst?

P.S.: Dazu hätten wir hier sogar eine FAQ [FAQ] Eigene Anwendung pluginfähig machen

11.04.2012 - 08:38 Uhr

Ich möchte noch der Antwort von el_panter hinzufügen:
Wenn Englisch deine Standard-Sprache ist, solltest du die MyForm.en.resx gar nicht benötigen, da die englischen "Werte" in die MyForm.resx, also die Datei ohne Sprachzusatz gehören, genau wie eben auch Icons und dergleichen. Alles, was sich dann nicht in einer bestimmten "Sprach-Resx" befindet, wird automatisch aus der Datei ohne Sprachzusatz gezogen.

03.04.2012 - 11:43 Uhr

Das war wohl die Kombo [STRG]+[E], ~~ und nennt sich "Visible White Space"
Auch nachzulesen hier: Spaces are displayed as light dashes in the text editor

02.04.2012 - 12:24 Uhr

Ich finds auch schon recht gut, und die Funktion für die sprechbaren Passwörter gefällt mir auch.
Was mir noch fehlen würde, wäre ein Knopf für die direkte Übernahme des aktuell angezeigten Passwortes in die Zwischenablage (am besten direkt vor oder hinter der Textbox für die Passwortanzeige), wäre das noch möglich?

so far
Karill Endusa

P.S.:
Vllt. könnte man neben dem Generator auch noch eine Passwortverwaltung mit einbauen? Nur ne Idee

26.03.2012 - 15:28 Uhr

Ein wichtiger Schritt in die richtige Richtung wäre, sich mit folgendem Artikel auseinanderzusetzen:
[Tutorial] Konfigurationsmodell im .NET Framework
Dort wird eigentlich das Wichtigste erklärt.
Wenn die Standard-Möglichkeiten (z.B. Datentypen) nicht ausreichen, so kann die Settings-Klasse, da sie partial ist, recht einfach erweitert werden.
Wenn du eigene Klassen oder Listen eigener Klassen abspeichern willst, vergiss nicht, diese als [Serializable] zu markieren (Entsprechend ist darauf zu achten, dass auch alle Werte in der Klasse, welche gespeichert werden sollen, serialisierbar sind).

14.03.2012 - 16:18 Uhr

Das ist natürlich auch eine Überlegung wert... mit einem Hinweis, dass das Control sich möglicherweise nicht ordnungsgemäß verhält, wenn man sich nicht daran hält...

Ich glaube der Einfachheit halber werde ich das auch so machen, danke.

so far
Karill

14.03.2012 - 16:06 Uhr

Okay cool,
so hab ich schonmal nen Anhaltspunkt und kann daran arbeiten 😃
Bedanke mich für diese Info

so far
Karill Endusa

14.03.2012 - 15:56 Uhr

wie ich bereits geschrieben habe, will ich verhindern, dass jemand bei meinem eigenen Control sich an das Event "MouseMove" ranhängt. override ist bei dem anscheinend nicht möglich:

private override event MouseEventHandler MouseDown; //Fehler: Virtuelle oder abstrakte Member können nicht privat sein.
private override MouseEventHandler MouseDown; //Der override-Modifizierer ist für dieses Element nicht gültig.

Wie in meinem ersten Beitrag zu sehen, ist "private" hier auch nicht von großem erfolg gekrönt (Intellisense hat es immer noch angeboten)

Es stimmt schon, dass nur ich dieses Event in der Klasse intern benutzen dürfen soll. Ich will einfach verhindern, dass jemand auch sich an MouseMove meines Controls hängt und so möglicherweise meine interne Logik zerstört, indem er das Control von außen so beeinflusst, wie es eben nicht vorgesehen ist in diesem Moment.