Laden...

Forenbeiträge von juetho Ingesamt 3.331 Beiträge

16.09.2009 - 11:36 Uhr

Hallo,

ich empfehle auch, das Rows.Add an das Standardverfahren anzupassen; das erspart auch noch die unsichere Variable i:

DataRow row = datatable.NewRow();
row[0] = "Montag";
row[1] = " ";
row[2] = "Wochendienst";
row[3] = "2";
datatable.Rows.Add(row);

Jürgen

15.09.2009 - 19:10 Uhr

Man sollte doch erwarten: wer sich neu an einem Forum anmeldet, liest die Regeln mindestens einmal durch. Wie poste ich richtig? Punkt 2.2 Keine Crossposts

Jürgen

15.09.2009 - 12:08 Uhr

Siehe DataGridView: Master/Detail über ComboBox. Dabei gibt es in der Tat zwei DataTables: zum einen die eigentlich gewünschte Tabelle als DataSource, die Nachschlagetabelle per DataRelation (ForeignKey).

Jürgen

15.09.2009 - 11:12 Uhr

es gibt doch was im .Net Framework von MS:

using System.Data.OracleClient;  

Richtig, aber die anderen in der Parameter-Artikelserie genannten Oracle-Provider sind unbedingt vorzuziehen. Jürgen

15.09.2009 - 10:42 Uhr

Zur Connection siehe auch connectionstrings und die dort genannten Oracle-Provider.
Zum Vergleich der Provider siehe auch die Hinweise in [Artikelserie] Parameter von SQL Befehlen.
Als Einführung in die DB-Verarbeitung siehe 🛈 Kap.25 (du musst lediglich statt der Sql-Klassen die Klassen aus dem von dir benutzten Provider benutzen).

Jürgen

@rollerfreak2
Diese Themen sind oft ein Zweifelsfall: Die Frage bezieht sich auch auf "Maske" und gehört damit zu WinForms. Aber "Tabellen" und "Oracle" und vor allem die Lösung gehören natürlich zu Datenbanken; das wäre in der Tat besser.

15.09.2009 - 09:29 Uhr

Ist allerdings nicht der DataAdapter, sondern der TableAdapter

Schau dir einmal die Designer.cs des DataSet an. Du wirst feststellen, dass jeder TableAdapter einen DataAdapter versteckt und intern damit arbeitet. Das ist schließlich eine der Begründungen für die Arbeit mit typisiertem DataSet und TableAdapter, dass der Anwender sich nicht mit den Einzelheiten befassen muss (was ich für falsch halte).

Also ist mein Hinweis die allgemeine Erläuterung, und deine Lösung ist die konkrete Umsetzung.

Jürgen

14.09.2009 - 18:59 Uhr

Ein paar Hinweise, warum deine bisherigen Gedanken falsch sind:

Wenn ich das dataGridView update, zeigt er mir weiterhin die geänderten Daten an.

Das DGV ist ein **Control **und für die Anzeige zuständig, nicht für die Inhalte. Das **Update **macht also nichts anderes als das Update für jedes Control:

Bewirkt, dass das Steuerelement die für ungültig erklärten Bereiche im Clientbereich neu zeichnet. (Von Control geerbt.)

DBDataSet.AcceptChanges();

Das ist völlig falsch, was in der :rtfm: leider nur versteckt zu finden ist: Entgegen dem üblichen Sprachgebrauch ist das keine Anweisung des Nutzers an das DataSet, dass die Änderungen gültig sein und gespeichert werden sollen. Vielmehr ist es die Mitteilung des Programmierers, dass die Änderungen erledigt sind; beim späteren Aufruf der Änderungsmethode werden diese Änderungen übergangen und nicht mehr berücksichtigt.

Aber du hast doch schon festgestellt, dass die Daten im DataSet zu stehen haben. Dann weißt du auch, dass sie mit DbDataAdapter von der Datenbank in das DataSet kommen. Dann könntest du auf die Idee kommen, dass **DbDataAdapter **auch für das Speichern zuständig ist - und dafür gibt es ein (anderes) Update.

Jürgen

14.09.2009 - 15:35 Uhr

Auch wenn es erledigt ist: Ich finde es schon dreist, eine solch einfache Frage, die durch schnelles Suchen in :rtfm: selbst zu beantworten ist, in zwei (oder noch mehr?) Foren zu stellen und unabhängig mehrere Leute damit zu beschäftigen. Jürgen

12.09.2009 - 17:55 Uhr

Du musst eben auch NumberStyles.AllowLeadingSign festlegen. Jürgen

12.09.2009 - 17:52 Uhr

Der Doberenz ist eines der schlechtestens Buchautoren, deren Werke ich je gelesen habe

Das kann man zum Glück nicht pauschal sagen. Nach Delphi 5 hat er vieles einfach kopiert und minimal überarbeitet, sodass die Qualität radikal nachließ. Aber Delphi 2005 für Delphi.NET wurde (zwangsläufig) neu geschrieben und sehr gut brauchbar. Jürgen

12.09.2009 - 16:23 Uhr

also ist es (das Semikolon) richtig

OK, den Zusammenhang mit dem do habe ich nicht gesehen; siehe den nächsten Punkt:

zu dem Punkt Überarbeitung.
Das verstehe ich gerade nicht. Ich hab doch Thema Entwicklung gewählt und meine Überschrift ist auch aussagend.Was genau willst du mir damit sagen?
Vllt das der Code richtig angezeigt wird ...

Ich will, dass der Code-Auszug in einem Kasten steht und als C#-Code gekennzeichnet ist (wie bei den anderen Beiträgen). Dann sind nämlich auch Schlüsselwörter und Einrückungen lesbar.

Eine Arbeitsanleitung dazu habe ich gegeben, und es steht auch in "Wie poste ich richtig?". Bitte erledige das. 🙄

Jürgen

12.09.2009 - 13:58 Uhr

Hallo und willkommen,

bitte überarbeite zunächst deinen Beitrag, damit er lesbar ist. Siehe Wie poste ich richtig? Punkt 6. Das kannst du auch nachträglich ändern: Beitrag zum Editieren öffnen, Code-Bereich markieren, auf den #-Button drücken, speichern.

So will ich deine Beschreibung nicht mit dem Code überprüfen.

Gruß Jürgen

PS. Ein paar Kleinigkeiten konnte ich trotzdem erkennen:

  1. Besser so:
while ((p % t == 1) || (t*t < p))

Das Semikolon am Ende dieser Zeile ist mit Sicherheit falsch!

  1. Ist wirklich modulo 1 gemeint?

  2. Verkürzte Addition:

t += 2;  // statt t = t + 2
12.09.2009 - 12:41 Uhr

Eine kleine Ergänzung zu tallas Hinweis: Für Datenbanken kann man (sowohl mit VS als auch mit #D) komplexe Lösungen erstellen. Typisierte DataSets erleichtern die Arbeit; aber der Designer (die IDE) bietet dafür nur teilweise Hilfen: in VS Express nur Zugriff auf MS-Produkte, bei #D nur indirekt über #Report.

Wohlgemerkt: die Einschränkungen betreffen nur die visuelle Hilfestellung per Designer; manuell per Code ist alles bei allen Versionen möglich.

Jürgen

12.09.2009 - 12:34 Uhr

Die Antwort lautet genauso wie in deiner ersten Frage: Du brauchst einen Einblick in das, was unter NET möglich ist und wie das geregelt wird. Beispielsweise musst du dir überlegen, wie du die Daten anzeigen willst und in welcher Form sie gespeichert werden sollen. Dazu brauchst du Grundlagenkenntnisse; die bekommt du durch systematisches Lernen in 🛈 📗 und schließlich durch Nachschlagen in :rtfm:

Jürgen

10.09.2009 - 14:17 Uhr

Tut mir leid, dann musst du den Rtf-String manuell erzeugen. Auch unter codeproject (Stichwort: RTF-Writer) gibt es nur rudimentäre Lösungen. (FZelles Vorschlag ist mir allerdings nicht untergekommen.)

Ich hatte mich mal selbst daran gesetzt; aber wegen der vielen Styles und der vielfältigen hierarchischen Gliederung der Elemente ist mir keine intuitive Klassengliederung und Bearbeitung eingefallen. Daraufhin habe ich es aufgegeben.

Gruß Jürgen

10.09.2009 - 09:22 Uhr

Hallo,

vielleicht stellst du deine Lösung noch vor, damit spätere Nutzer, die auf deine Frage stoßen, auch etwas davon haben. Siehe Wie poste ich richtig? 9. Eigene Lösungen posten

Jürgen

07.09.2009 - 14:27 Uhr

Im Prinzip selbstverständlich: Einlesen, Anzeigen und Speichern sind völlig getrennte Maßnahmen. Wie gesagt: wenn du InsertCommand, UpdateCommand, DeleteCommand manuell erstellst (mit allen nötigen Feldern sowie passenden Parametern) und dem DataAdapter zuweist, kannst du dennoch mit dem Update-Befehl arbeiten.

Jürgen

07.09.2009 - 08:53 Uhr

Die Fehlermeldung sagt es genau:

Dynamische SQL-Generierung wird gegen mehrere Basistabellen nicht untersützt.

Dein SELECT-Befehl, aus dem die Speichern-Befehle erzeugt (generiert) werden sollen, verknüpft zwei Basistabellen; und damit kann der CommandBuilder (und auch der Designer für den TableAdapter) nichts anfangen. Ein UPDATE-Befehl bezieht sich immer auf eine Tabelle und benötigt eine WHERE-Bedingung, um eindeutig einen Datensatz identifizieren zu können. Woher soll der CommandBuilder erkennen, für welche der beiden Tabellen ein UPDATE erzeugt werden soll und welches Feld für den PrimaryKey verwendet wird?

In vielen Forumsbeiträgen bekommst du den Hinweis (der in der MSDN leider nur versteckt zu finden ist): "Der SELECT-Befehl muss sich auf genau eine Tabelle beziehen und den PK (bzw. eine eindeutige Spalte) enthalten; andernfalls kann der CommandBuilder die Befehle nicht automatisch erzeugen."

Lösung: Du musst den SELECT-Befehl auf jeweils eine Tabelle beziehen und den PK benutzen. Oder du musst UpdateCommand usw. für den TableAdapter manuell schreiben und zuweisen.

Jürgen

04.09.2009 - 17:50 Uhr

Mit SqlParam arbeite ich definitiv nicht, geht das auch anders??

Wenn du die miserabelste Lösung haben willst, bitte sehr; dann bastel deinen Sql-Befehl als String-Verknüpfung. Für jede korrekte Programmierung gilt:

**:::

Alle anderen Informationen siehe [Artikelserie] Parameter von SQL Befehlen

Jürgen

04.09.2009 - 11:51 Uhr

Wie poste ich richtig? Zuerst suchen.

Über die Forumssuche nach connectionstring ändern gibt es eine ganze Reihe passender Treffer; durch die Einbeziehung von "TableAdapter" und/oder "Designer" kann das Suchergebnis noch verbessert werden.

Jürgen

03.09.2009 - 14:59 Uhr

Ist eine Assembly nicht eine Art Komponente?

Wie kommst du bloß auf so etwas? Eine Assembly ist sozusagen der Oberbegriff für DLL oder EXE unter NET. Für "Komponente" gibt es viele Begriffsebenen, u.a. das, was zur Component-Klasse gehört.

Jürgen

03.09.2009 - 12:40 Uhr

Auf Dataset will ich verzichten

Das ist falsch.

Wie macht mans richtig?

Indem man eine Klasse (bzw. eine Instanz) für die Daten benutzt, z.B. DataSet/DataTable.

Das DataGridView ist, wie der Name schon sagt, ein Grid zur Anzeige (oder Bearbeitung) von Daten. Die Werte müssen aus einer Datenmenge kommen; sie dürfen nicht direkt in die DGV-Zellen eingetragen werden.

Wenn du das beachtest, ist es klar (was der "Erfinder" sagt), dass nicht das Control mehrfach benutzt und übergeben werden darf, sondern die Daten.

Jürgen

31.08.2009 - 18:40 Uhr

Hallo,

ich finde es sehr seltsam, alle Werte als String zu übernehmen, in ein String-Array aufzuteilen und einzeln zu verarbeiten: Einen String mit ToString in einen String zu konvertieren ist sowieso Quatsch: Cols[0] ist ein String, was sollen also GetValue und ToString daran noch ändern. 8o int.Parse und double.Parse passen zwar, wenn du wirklich sicher bist, dass die Werte korrekt sind, aber kann man das nicht mit typengenauer Übergabe der Werte vermeiden?

Kann es sein, dass der PrimaryKey eine Autoinc-Spalte ist und der übergebene Wert dem widerspricht?

Wie kann ich das erstellte SQL (inklusive Parameter) überprüfen?

Falls du meinst, dass die Parameter-Werte in den String eingefügt werden: Beim "richtigen" MS-SQL geht das nicht, bei der Compact-Version vermutlich auch nicht. Der Provider übergibt den SQL-Befehl "nackt" und fügt dann die Parameter hinzu.

Du kannst aber über die Forumssuche zu Ersatzlösungen kommen (mit dem Management Server oder Profiler, ich glaube das ist der wichtigste Suchbegriff).

Ist ein Fehler im Code?

Ein offensichtlicher nicht.

Gruß Jürgen

31.08.2009 - 18:29 Uhr

Hallo,

schau einmal, ob einer der Hinweise in [Gewusst wie] in ToolStrips ComboBox, TextBox, ProgressBar anpassen weiterhilft.

Jürgen

27.08.2009 - 09:48 Uhr

Hallo,

du musst zwischen den Namen in der Datenbank und den Namen im Programm (hier: DataSet) unterscheiden. Mit deinem allgemeinen Fill-Befehl arbeitest du so, siehe :rtfm: DbDataAdapter.Fill-Methode (DataSet):

Fügt dem DataSet unter Verwendung des DataSet-Namens Zeilen hinzu bzw. aktualisiert diese, um eine Übereinstimmung mit den Zeilen in der Datenquelle zu erzielen, und erstellt eine DataTable mit der Bezeichnung "Table".

Aber es gibt soviele Varianten für Fill; schau einfach selbst in :rtfm: nach.

Gruß Jürgen

25.08.2009 - 19:00 Uhr

Hallo und willkommen,

bitte benutze zuerst die Forumssuche, z.B. tableadapter laufzeit liefert einige Hinweise.

Jürgen

PS. Es ist kein Verstoß gegen unsere Forumsregeln, wenn du nach einiger Wartezeit hier fragst. Aber bitte verweise in dem anderen Forum darauf, dass die Diskussion jetzt hier läuft. Danke!

25.08.2009 - 10:07 Uhr

Wieso wundert dich das, wenn du WrapMode (also die Art des Zeilenumbruchs) ausdrücklich auf True festlegst? Siehe :rtfm: DataGridViewCellStyle.WrapMode i.V.m. DataGridViewTriState.

Jürgen

23.08.2009 - 13:38 Uhr

Warum kommt es immer wieder vor, dass jemand zu faul ist zum Suchen? Forumssuche nach string kombinationen liefert u.a. eine Diskussion mit fast identischem Titel.

Siehe auch Wie poste ich richtig? Zuerst suchen

Jürgen

PS.
Michaels Snippet ist noch besser; aber auch das würde durch korrektes Suchen gefunden: Wozu gibt es denn Links auf FAQ, Artikel, C#-Snippets? 8o

22.08.2009 - 14:09 Uhr

Durch eine Schleife.

Da schon in deinem Beispiel der Wert "Hallo" doppelt vorhanden ist, ist das Ergebnis natürlich nicht eindeutig. Deshalb kann es auch keine direkte Antwort durch eine vorgefertigte Methode geben, und darum schrammt die Frage zusammen mit meiner Antwort hart an Wie poste ich richtig? 1.1.1 Nicht nach Grundlagen fragen vorbei.

Jürgen

20.08.2009 - 13:44 Uhr

Hallo,

ich habe meine Zweifel, ob Merge wirklich weiterhilft. Dann hast du doch nur eine weitere (noch größere) DataTable und musst deren Inhalte mit Table1 und Table2 vergleichen.

Aber lies einmal :rtfm: DataTable.Merge durch, vergleiche die Überladungen und vor allem die Hinweise. Das sollte auch Vorschläge für dein ganzes Vorgehen enthalten.

Übrigens ist ein weiteres DataSet überflüssig. Du kannst die beiden DataTables innerhalb desselben DataSet mischen und auch die Datensätze, die du durch den Vergleich bekommst, dort (ggf. in einer weiteren DataTable) zwischenspeichern.

Als Ersatz für DataRow.Clone gibt es übrigens ImportRow, das könnte ebenfalls helfen.

Am wichtigsten ist "Erfinders" Hinweis auf DataRowState; der ist verantwortlich dafür, dass und wie beim Update gespeichert wird.

Nebenbei: [Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen, das gehört jeweils in einen using-Block. Trenne die Datenspeicherung im DataSet vom Abholen und Speichern (es tut mir immer weh, wenn beim Abrufen von Daten ein neues DataSet erzeugt wird).

Gruß Jürgen

@ErfinderDesRades
Wo ist deine Empfehlung für ein typ. DataSet geblieben? Aber dein Deutsch - siehe "Nachm Update setzterse" - ist wirklich eine Katastrophe.

19.08.2009 - 17:56 Uhr

Du verschweigst uns immer noch den korrekten Inhalt des Select-Befehls, außerdem die Fehlermeldung.

Der DbCommandBuilder verlangt, dass ein PrimaryKey im SELECT und in der DataTable enthalten sein muss. Wie soll er sonst einen Update- oder Delete-Befehl eindeutig identifizieren können?

Normale Tabellen ohne ID oder autowert

Ich behaupte, eine normale Tabelle muss eine ID enthalten, sonst ist es keine richtige Tabelle.

Übrigens missfällt mir, dass eine einzelne DbConnection bei dir dataConnections (also Plural) heißt. Das Open und Close kannst du auch noch streichen; das macht der DbDataAdapter selbständig.

Jürgen

19.08.2009 - 12:15 Uhr

Access und decimal führen zu Problemen, siehe die allerletzte Bemerkung unter
[Artikelserie] Parameter von SQL Befehlen

Gruß Jürgen

18.08.2009 - 18:59 Uhr

Tabellen- und Spaltennamen können grundsätzlich nicht als DbParameter festgelegt werden. (Es gibt allenfalls komplizierte Umwege.) Jürgen

18.08.2009 - 18:02 Uhr

Hallo,

unter [FAQ] Kommunikation von 2 Forms und den dortigen Verweisen gibt es viele Hinweise, warum du das nicht machen sollst, warum es niemals erforderlich ist und was man stattdessen machen kann.

Gruß Jürgen

PS. Und außerdem ein Verstoß gegen Wie poste ich richtig? Punkt 2.2, siehe dort

18.08.2009 - 15:21 Uhr

Unabhängig von "Erfinders" Hinweisen kannst du auch eine "frei umherschwebende" DataTable benutzen. Ein DataSet ist eigentlich nichts anderes als eine Sammlung von DataTables. Wenn du schon alles auf eine DataTable ausgerichtet hast, kannst du dabei bleiben; alles, was man üblicherweise mit DbDataAdapter macht, kann auch mit einer DataTable (ohne DataSet) gemacht werden.

Gruß Jürgen

18.08.2009 - 13:54 Uhr

Tja, der **DbDataAdapter **muss natürlich wissen, wie Daten zu speichern sind. Er benötigt also einen InsertCommand für neue Datensätze, einen UpdateCommand für Änderungen und einen DeleteCommand für Löschungen. Diese werden vorzugsweise per **DbCommandBuilder **erzeugt, siehe z.B. unter Datenbanken-HowTo - das fehlt bei dir vollständig. Außerdem hat der ein paar Voraussetzungen: vor allem PrimaryKey muss vorhanden sein, keine JOINs.

Gruß Jürgen

18.08.2009 - 13:48 Uhr

Hallo und willkommen,

für Access gibt es keinen "speziellen", aber **Oledb **ist ein wenig besser als Odbc. Für die Inhalte der Verbindung siehe auch ConnectionStrings, wobei die Access-Version zu beachten ist.

Gruß Jürgen

17.08.2009 - 17:10 Uhr

Eine Möglichkeit steht unter DataGridView: Master/Detail über ComboBox. Jürgen

14.08.2009 - 08:41 Uhr

Muss die Datenquelle evtl eine bestimmte Schnittstelle implementieren?

Ja, siehe :rtfm: DataGridView.DataSource in den Hinweisen, nämlich IList, IListSource, IBindingList, IBindingListView. Komplizierter sind die Hinweise hinsichtlich BindingSource.DataSource.

Wie du die "freie Eingabe" einbinden musst und was dein Problem mit diesen Hinweisen zu tun haben könnte, weiß ich allerdings auch nicht.

Gruß Jürgen

14.08.2009 - 08:33 Uhr

Für solche Wünsche ist CodeProject immer eine gute Adresse, sowohl was fertige Elemente als auch Ideen betrifft. Jürgen

13.08.2009 - 12:28 Uhr

Hallo Robs,

du hast recht: es sieht etwas unelegant aus. Ich könnte mir vorstellen, dass man eine der FAQ-Lösungen direkter und "schöner" übernehmen könnte; aber meinetwegen...

Mit Sicherheit falsch und im Widerspruch zu deinen Intentionen dürfte sein, dass du den EventHandler unmittelbar im KeyPress wieder abhängst. Nach Eingabe und Prüfung des ersten Zeichens soll die Prüfung abgebrochen werden? Das kann ich mir nicht vorstellen.

Benutze stattdessen CellEndEdit oder CellLeave für diese Maßnahme.

Gruß Jürgen

12.08.2009 - 13:24 Uhr

Ein DataSet soll nicht die Struktur deines DB-Modells nachbilden. Eher sollte ein DS die Daten halten, die der Benutzer aktuell benötigt.

Ich bin im Gegensatz dazu der Meinung, dass das DataSet durchaus die Struktur der DB nachbilden kann/soll. Unabhängig davon soll es tatsächlich nur diejenigen Daten enthalten, die aktuell benötigt werden. Bitte unterscheide zwischen der Struktur und der konkreten Datenmenge.

@Satanic_Vegeta
Entscheidend ist die Trennung/Unterscheidung zwischen den Daten auf der Festplatte, den Daten im Arbeitsspeicher und den Daten in der GUI. Dein Problem ist also die Verknüpfung zwischen diesen Teilen.

Zwischen Datenbank und DataSet können DbDataAdapter und/oder einzelne DbCommands gesetzt werden. Du benötigst für jede DataTable einen eigenen DbDataAdapter; aber ansonsten gibt es keine Probleme. Genau das ist der Vorteil von typ. DataSets incl. DataRelation (= ForeignKey). Dein bisheriger Weg ist also keinesfalls falsch (auch wenn es Alternativen gibt).

Zwischen DataSet/DataTables und GUI ist sinnvollerweise je eine BindingSource zu setzen, damit der Wechsel von Datensätzen und Aktualisierungen in verschiedenen Elementen automatisch passen.

Konkrete Anmerkungen: Du brauchst ein DataSet mit 4 DataTables. Du brauchst keine Kopien davon. Das MainForm bekommt lediglich eine Referenz auf dieses DataSet - fertig.

Hast du dich einmal mit 🛈 Kap. 25 ff. befasst?

Gruß Jürgen

11.08.2009 - 16:47 Uhr

Hallo und willkommen,

ich hoffe sehr, dass du die Daten nicht per Code direkt aus der Datenbank in das DGV geschrieben hast. Das wäre nämlich ein äußerst ungünstiges Vorgehen: Das DGV ist, wie der Name schon sagt, dazu da, Daten in einem Grid zur Anzeige (und Bearbeitung) zu bringen. Grundlage ist deshalb ein Objekt "Daten", meistens eine DataTable, die per **DataSource **an das DGV gebunden wird.

Für die Sortierung kannst du eine **BindingSource **an die DataTable binden, die du beliebig sortieren kannst - auch nach mehreren Spalten; diese BindingSource wird dann an das DGV gebunden.

Zum Auslösen des "manuellen" Sortierens kannst du das ColumnHeaderMouseClick-Ereignis verwenden.

Gruß Jürgen

11.08.2009 - 09:25 Uhr

Ich bin der Meinung, dass du etwas zu wenig Informationen lieferst, um sinnvoll antworten zu können. Zum Ausgleich fragst du mehrfach, nämlich auch hier und hier. Der erste Schritt vor einer Frage sollte nach Wie poste ich richtig? gehen; und Punkt 2 verbietet (mit Begründung!) solche Doppelfragen. Jürgen

10.08.2009 - 13:23 Uhr

Heißt das, ich müsste jeden Datentyp anders behandeln?
...
Das wäre aber so oder so ziemlich umständlich.. 😦

Was glaubst du denn, wie ein Programm, das sich auf Bilder spezialisiert hat, mit doc-Dateien umgehen kann? Oder ein Programm, das sich die bequeme Bearbeitung von xml-Dateien vorgenommen hat, mit jpg-Dateien umgehen soll?

Merkst du nicht, dass dein Anspruch "einheitlicher Aufruf für alles, wie unterschiedlich es auch sein mag" sehr naiv ist?

Du kannst nur den Vorschlag von Th69 versuchen und hoffen, dass Windows die richtigen Programme anhand der Extension herausfindet und mit dem Parameter "/p" den Druck aktivieren kann. Wenn du das nochmal genauer liest, dann schlägt er ein einheitliches Vorgehen vor.

Jürgen

09.08.2009 - 18:17 Uhr

undzwar habe ich in meiner main-form einen TabControl, den ich von "aussen" mit Reitern / Tabs füllen möchte.

Das ist ein ungünstiges, in der Regel falsches Vorgehen. "von außen" hat normalerweise niemand und nichts Zugriff auf Controls eines Formulars. Du darfst "von außen" lediglich etwas innerhalb des Formulars anstoßen, z.B. eine Methode aufrufen und ihr Parameter übergeben; diese Methode führt dann die entsprechenden Maßnahmen aus.

Untersuche einmal [FAQ] Kommunikation von 2 Forms und die dort genannten Querverweise. Dort erhältst du viele Hinweise über die Zusammenarbeit verschiedener Klassen.

Übrigens: "Zugriff auf main" [EDIT=herbivore]das war der ursprüngliche Titel, den ich aber geändert habe[/EDIT] ist eine schlechte Formulierung, wenn du das MainForm meinst. "main" hat schließlich als Main-Methode einer Application eine besondere Bedeutung. Falsche Bezeichnungen führen schnell in die Irre.

Gruß Jürgen

09.08.2009 - 13:33 Uhr

Hallo und ebenfalls willkommen, auch an Nils!

TimeSpan.TotalDays ist nicht ganz so gut; besser ist TimeSpan.Days. Daraus müsste die Anzahl der Monate errechnet werden, entweder nährerungsweise mit Division durch 30 oder durch eine Schleife. Beides ist aber umständlicher, weshalb auch Nils' Vorschlag nicht besonders gut ist.

Sinnvoll ist deshalb nur blackcoins Vorschlag. Du musst bei der Subtraktion zweier Monate nur noch einen Jahreswechsel berücksichtigen. (Ich drücke mich absichtlich schwammig aus, damit du selbst noch etwas zu überlegen hast.)

Gruß Jürgen

/Grrrh
David wollte dieses Nachdenken übernehmen.

07.08.2009 - 10:57 Uhr

Hallo,

Jacks Nachfrage ist wichtig.

Ich könnte mir folgendes Problem vorstellen: Du weist den DialogResult des Lizenzierungs-Formulars direkt und unmittelbar dem DialogResult des Hauptformulars zu. Ein modales Dialogfeld wird dadurch sofort ausgeblendet, wie in :rtfm: zu lesen ist. Ich könnte mir vorstellen, dass dein this-Formular dadurch zumindest irritiert wird.

Vorschlag: Benutze nicht this.DialogResult, sondern frage l direkt ab:

using(Lizenzierung l = new Lizenzierung())
{
  if (l.ShowDialog() == DialogResult.OK)
    this.Close();
}

Übrigens ist es riskant, einen Close-Aufruf in den Konstruktor oder so zu setzen:

zeig ich dir einfach mal den Aufruf der Form

Benutze die Forumssuche, dazu gab es sicherlich schon viele Diskussion und Hinweise.

Gruß Jürgen

06.08.2009 - 15:10 Uhr

Hier habe ich mich und den Themenersteller u.a. gefragt, ob er überhaupt mit GridView arbeitet, wie er behauptet. Dies ist damit auch ein Fall für Wie poste ich richtig? Punkt 2.2

Jürgen