Naja, die Tabelle ist eine Lookup - Table für die Länder.
Ich habe in der Haupttabelle ein Country_ID und eine Nationality_ID, welche je einen Fremdschlüssel auf einen Eintrag in der Country - Tabelle darstellen. Nun habe im DataSet eine Tabelle Country und habe beide Comboboxen damit verbunden. Ginge es möglicherweise auch, wenn ich zwei DataViews mit dem DataSet verwenden und die Comboboxen an die DataViews binde?. Oder vielleicht kann ich ja einfach zwei BindingSource Objekte machen, die auf das gleiche DataSet zeigen? Werds gleich mal ausprobieren! 🙂
Hallo zusammen, ich habe folgendes, sehr merkwürdiges Problem:
Ich habe ein TextBox mit einem Feld in einer DataTable verknüpft. Wenn ich nun etwas in die Textbox schreibe, so kann ich die Änderung in der entsprechenden DataRow sehen. Doch aus irgendeinem Grund steht im Property DataRow.RowState immer DataRowState.Unchanged. Meine Frage ist nun, wieso dies so ist, denn wenn ich im Code Änderungen vornehme: this.dtaSet.Tables["Person"].Rows[0]["FamilyName"] = "wasweisich";
Dann steht im RowState dieser DataRow DataRowState.Modified und zwar solange, bis ich AcceptChanges() oder RejectChanges() aufrufe. Kann es sein, dass die DataTable die Änderung nicht bemerkt, wenn diese durch ein Binding erzeugt wurde?
Gruss Ishildur
Hallo zusammen, gibt es irgendeine Möglichkeit, den gerade aktive Datensatz einer DataTable zu ermitteln, oder hat eine DataTable gar keinen Datensatz - Zeiger?
Noch eine zweite Frage:
Falls nein, wie ist dann folgendes Phänomen zu erklähren: Wenn ich zwei Comboboxen habe, die auf diesselbe DataTable zeigen, dann ändert der ausgewählte Eintrag beider Comboxen... Wie ist dies zu erklähren, resp. wie kann man es verhindern?
Ich hoffe, jemand von euch weiss Rat!
Mfg Ishilldur
Ja, aber dann werden ja die Informationen in der Personen - Tabelle des DataSets nicht aktualisiert? 😭
@herbivore
Ich habe einfach eine heiden Mühe mit diesen Comboboxen, habe inzwischen ein weiteres Problem ähnlicher Natur:
Folgende Situation:
1 DataSet
2 Tabellen (Person, Country)
Die Tabelle Person hat einen Fremdschlüssel Country_ID, der einen Eintrag aus der Country Tabelle referenzieren soll, damit man weiss, aus welchem Land der entsprechende Benutzer stammt!
So, in meinem Form habe ich nun eine Combobox, in welcher der Benutzer das Land des Benutzers auswählen können sollte:
Also, die Combobox soll mal mit den Werten aus der Country- Tabelle gefüllt werden:
Dazu mache ich DisplayMember = Country.Name, ValueMember = Country.Country_ID
Soweit so gut, das funktioniert auch bestens, aber es muss doch nun ein drittes Property geben, in welchem ich sagen kann, wo er den schliesslich vom Benutzer ausgewählten ValueMember hinschreiben soll. ??? = Person.Country_ID
Aber ich sehe immer nur zwei: DisplayMember und ValueMember... X(
Naja, das ist mir schon klar, aber die Frage ist eben, wie ich diese Daten anlegen sollte resp. wie ich von der Combobox darauf zugreifen soll.
Ich habe versucht, sie in die Items Collection zu schreiben, doch das hat irgendwie nicht so funktioniert.
Überhaupt werde ich aus der Combobox nicht so richtig schlau, ich meine es gibt 2 Felder:
DisplayMember sowie ValueMember
Aber dies sind doch lediglich die Lookup - Felder. Es sollte doch eigentlich noch ein drittes Feld geben, in welchem ich definiere, in welches Feld des DataSet es den gewählten Wert von ValueMember hinschreiben sollte?
Datenbank:
Civilstate TINYINT NULL
DataSet
Civilstate Byte
Für das Combobox
Unbekannt = 0
Ledig = 1
Verheiratet = 2
Geschieden = 3
Verwittwet = 4
usw.
Die Datenbank sowie das DataSet weiss allerdings nichts von diesen Strings, dort ist eben nur ein Zahlenwert gespeichert! In der Combobox hingegen möchte ich ja keine Zahlen, sondern die entsprechende Strings!
Hallo allerseits
Ich habe in meiner Datenbank ein Feld Zivilstand, welches als TINYINT, also als ein Byte dargestellt wird. Jede der möglichen 256 darin abbildbaren Zahlen bedeuten einen bestimmten Zivilstand, ähnlich einem Enumerator, wobei natürlich bei weitem nicht alle davon genutzt werden.
Die Combobox hat ja nette eigentschaften wie DataSource, DisplayMember sowie ValueMemeber. Dies funktioniert ganz hervorragend, wenn ich bspw. eine Lookup Datenbanktabelle habe. So könnte ich bei DisplayMember Zivilstand und bei ValueMember Zivilstand_ID eingeben. Aber nun ist es ja so, dass ich Übersetzung der Zahlen nur im Programm existiert! Wie muss ich denn nun hier die Properties der Combobox setzten ?
Einen lieben Gruss Ishildur
Ausserdem das Tabcontrol, welches es erlaubt, Icons auf die Tabs zu knallen und natürlich nicht zu vergessen das TabbedGroup - Control, welches es erlaubt, zur Laufzeit ein neues Tab aus einem Form zu erzeugen. Ich habe das Programm, welches ich nun seit einem halben Jahr am schreiben bin, auf DotNetMagic umgestellt und bin eigentlich sehr zufrieden. Ist vom LookAndFeel sowie vom Handling kaum vom VisualStudio 2005 zu unterscheiden! 🙂 🙂 🙂
Den Docking Manager und das TreeView, welcher es erlaubt, Gruppen zu machen!
Na schön, aber was ist denn nun besser als DotNetMagic?
Natürlich könnte ich das machen, aber kann ich leider die Columns Collection nicht mehr im Designer anpassen. Stell dir mal vor, ich habe noch einige berechnete Spalten im DataSet, von welchen ich nicht alle im DataGridView anzeigen möchte, ausserdem nimmt das DataGridView per Default die Spaltennamen anstatt die Spaltenüberschriften als seine eigene Spaltenüberschriften. Diese müssten sich in den Childs überschreiben lassen, aber leider fehlanzeige...
Übrigens gibt es eine visuelle Komponente, um zur Laufzeit die Daten zu filtern? Ich möchte z.B. dass nur alle Daten, dessen Vorname mit 'm' anfangen von der Datenbank holen! usw. Natürlich kann ich sowas selbst machen, aber eine entsprechende Komponente wäre wirklich nicht schlecht! 🙂
Das meiste gibt es entweder kostenlos woanders, oder mehr und besser für das gleiche Geld 😉
Wo denn, was denn? Immerhin waren es Leute in diesem Forum, die sagten: Musst du halt DotNetMagic kaufen... Microsoft verwendet auch DotNetMagic... Tralali tralala.... usw... usw...
Und dieses Problem ist eine Designentscheidung von MS, Du sollst eben in abgeleiteten Formen nicht den "Master" ändern, sonst bräuchtest Du ja keine Vorlage.
Sag mal, ich nehme an, du hast die <sarkasmus></sarkasmus> Tags vergessen oder? Methodenüberlagerung "Ja", aber Wertüberlagerung "Nein" ??? 🤔 Ja klar! Das war mit Sicherheit eine "Designentscheidung" von MS, das wird es sein! 😜
Ich möchte nämlich sämtliche visuellen Einstellungen, wie die DefaultRowHeaderStyles, DefaultRowStyle usw. sowie abgefangenen Events wie onPaint vom DataGridView in der Parentclass übernehmen und in den Childs nur das verdammte DataSource und DataMember ändern!
Schade, nun muss ich wohl die 4 Seiten Quellcode von onPaint in allen Childs neu definieren, weil ich DataGridView nicht ins Parent setzten kann...
Suuuuuuper "Designentscheidung" MS! Toll gemacht! Ich bin stolz auf euch! 👍 👍
Der Designer hat anscheinend noch so oft ein Problem, was? Ist da irgendein Patch in sicht? Mit der DotNetMagic 4.0 Kollektion habe ich auch so meine Schwierigkeiten und dafür habe ich auch wieder 400 EURO bezahlt und das Ding läuft mehr schlecht denn recht!!
Ich glaube die Sprache C# ist nahezu perfekt, der Designer bräuchte allerdings mal ein grooooooses ServicePack!!! Oder was meinst du dazu?
Hallo allerseits
Ich habe folgendes wirklich merkwürdiges Problem:
Ich habe ein Form, in welches ich ein DataGridView setzte. Schliesslich erzeuge ich ein neues Form, welches vom alten Form vererbt wird! Nun kann ich aber im vererbten Form die Werte nicht mehr manipulieren, und das obwohl in den Modifier in dem Basisformular auf Protected gesetzt habe 8o! Was mache ich falsch? Ich hoffe, jemand hat eine Idee, ich habe nämlich keine Lust, dieses verflixte DataGridView für jede Vererbte Instanz neu zu setupen!
Mfg Ishildur
Hallo zusammen
Ich bin gerade ASP.NET am lernen und möchte fragen, was ist denn der Unterschied zwischen den Endungen *.asp und *.aspx?
Mfg Ishildur
Hallo zusammen, als ich heute morgen aufwachte und als erstes dieses Forum durchstöberte, erlebte ich eine unangenehme überraschung: Ist denn von euch noch niemand an dieses Problem gestossen? 8o Das fällt mir schwer zu glauben! 😭
Dasselbe Problem habe ich übrigens auch mit dem vererbten Kontextmenu, der Toolbar usw, allerdings nicht mit dem DataSet?
Hallo zusammen, ich habe folgende Situation:
Ich habe ein Formular FRM_List, welches eine Listbox implementiert. Nun habe ich ein Formular FRM_PersonList, welches nun von FRM_List erbt. Das Problem ist nun, dass ich keine der Eigenschaften vom vererbten DataGridView in dem Formular FRM_PersonList editieren kann. Wieso geht denn das nicht? Den Modifier habe ich auf Protected gesetzt!
Mfg Ishildur
Einen schönen guten Morgen alle zusammen
Wenn ich nun eine neue Transaktion starte und einige Datensätze hinzufüge und gleichzeitig startet ein anderer eine neue Transaktion, die parallel auf dem Server läuft, wie sieht es dann mit den autoincrement Primärschlüsseln aus, die auf dem Server angelegt werden? Dann habe ich doch mehrmals die ID 1,2,3 usw. oder werden die dann Transaktionsübergreifend angelegt, in diesem Fall muss ich aber fragen, wie es dann mit den Master / Child Datensätzen einer 1:n Beziehung ausschaut:
Folgende Situation:
Benutzer 1 speichert einen Masterdatensatz auf dem Server. Unmittelbar darauf, speichert Benutzer 2 ebenfalls einen neuen Datensatz auf dem Server und zwar ebenfalls einen Masterdatensatz. Nun speichert Benutzer 1 einen Childdatensatz, wofür er den automatisch generierten Primärschlüssel des von ihm vorhin erzeugten Masterdatensatz benötigt. @IDENTITY
Nun ist es aber doch so, das @IDENTITY den letzten Datensatz zurückgibt, und dies wäre dann eben der Datensatz, der von Benutzer 2 angelegt wurde, was zu einer fehlerhaften Datenverknüpfung führen würde?
Oder ist es vielleicht so, dass @IDENTITY den letzten Datensatz der aktuellen Transaktion zurückgibt, die automatischen Primärschlüsseln auf dem Server allerdings transaktionsübergreifend anlegt. Zumindest ich würde es vermutlich so programmieren, wenn ich Mitarbeiter von Microsoft wäre!
Lg Säm
P.S.
Ich weis, ich frage ziemlich viel und es ist mir beinahe schon ein wenig unangenehm, aber ich muss das System schon sicher verstehen, um die Vor- bzw. Nachteile einschätzen zu können und eventuell darauf umzusteigen!
Eine <<hoffentlich>> vorerst letzte Frage: Bei den Datentypen von den Columns im DataSet. Stelle ich da besser SQL Datentypen oder Native Datentypen ein? Möglich ist anscheinend beides...
Ich habe in meinem DataSet 6 Tabellen und diverse 1:n bzw. m:n Beziehungen. Entsprechend habe ich in meinem SqlDataAdapter natürlich auch 6 Select Anweisungen bzw. 6 Delete Anweisungen usw. Ich frage mich allerdings, woher denn der DataAdapter weis, welche der 6 Select - Anweisungen er benutzen muss, um bzw. die Country - Tabelle aufzufüllen. Die Fill - Methode rufe ich folgendermassen auf: this.sqlAdp.Fill(this.dtaSet.Tables["Country"]). Oder muss ich vielleicht für jede Tabelle im DataSet ein eigener SqlDataAdapter haben? Ich blicke da irgendwie überhaupt nicht mehr durch! X(
Also FRM_SqlEdit ist eine Basisklasse, von welcher dann z.B. PersonEdit abgeleitet werden. Im Load - Event wird die Fill - Methode aufgerufen. Siehe Code. Die SqlCommands des SqlDataAdapter sowie das komplette DataSet werden jeweils im Konstructor von den abgeleiteten Klassen mit Hilfe des Designers konfiguriert. Die Exception wird von der Methode Fill der Basisklasse geworfen. Es kommt durchaus vor, dass ein SelectCommand mehrere durch Semikolon separierte Select - Statements beinhaltet, für welche je eine separate DataTable erzeugt werden muss. Diese Tabellen werden eben nun im Designer zur Entwicklungszeit vorbereitet mit Datentypen der Columns, Constraints usw. Wenn ich also nun im DataSet eine Tabelle mit dem Namen Person habe und ein SELECT * FROM Person im SqlDataAdapter, dann sollte er die Daten doch in die entsprechende Tabelle mit dem Namen Person im DataSet einfüllen. Stattdessen erzeugt er aber eine neue Tabelle mit dem Namen Table und dies obwohl ich das Properite MissingSchemaAction auf Error gesetzt habe und nicht auch Add oder AddWith Key!
// -------------------- event - handler for the event "FRM_SqlEdit_Load" --------------------
private void FRM_SqlEdit_Load(object sender,EventArgs e) {
// check if the current site is in design - mode
if(this.DesignMode) return;
// check if the properties aren't in a valid condition
if(this.sqlCon == null || this.sqlTrn == null) {
// prepare the message and throw an exception
String strExp = "The Connection or the Transaction has not been initialized";
throw new InvalidOperationException(strExp);
}
// open a try - statement as there may occur errors
try {
// get data from the sql - database
this.sqlAdp.Fill(this.dtaSet);
}
// define a catch statement for handling possible errors
catch(SqlException exp) {
// inform the user, close this window and return
new FRM_Exception(exp,this.sqlCon).ShowDialog();
this.Close();
}
}
// ------------------------------------------------------------------------------------------
Ich hoffe echt, dass jemand von euch eine Idee hat, ich komme langsam aber sicher ein klein wenig unter Zeitdruck!
Gruss Ishildur
Übrigens habe ich MissingSchemaAction auf Error gesetzt, der sollte eigentlich eine Exception werfen, wenn die entsprechende Tabelle im DataSet nicht vorhanden ist!
Ja natürlich ist die schon vorhanden, damit ich im Designer schön die Columns und eferences definieren kann! Kann ich es denn nicht so machen, dass Fill keine "neue" Tabelle anlegt, sondern einfach diejenige mit dem entsprechenden Namen im DataSet verwendet? Wie soll ich denn sonst, im Designer das DataSet vorbereiten?
Gruss Ishildur
System.InvalidOperationException was unhandled
Message="Missing the 'Table' DataTable for the 'Table' SourceTable."
Source="System.Data"
StackTrace:
at System.Data.Common.DataTableMapping.GetDataTableBySchemaAction(DataSet dataSet, MissingSchemaAction schemaAction)
at System.Data.ProviderBase.SchemaMapping..ctor(DataAdapter adapter, DataSet dataset, DataTable datatable, DataReaderContainer dataReader, Boolean keyInfo, SchemaType schemaType, String sourceTableName, Boolean gettingData, DataColumn parentChapterColumn, Object parentChapterValue)
at System.Data.Common.DataAdapter.FillMapping(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 schemaCount, DataColumn parentChapterColumn, Object parentChapterValue)
at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
at System.Data.Common.DataAdapter.Fill(DataSet dataSet, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
at QAS.FRM_SqlEdit.FRM_SqlEdit_Load(Object sender, EventArgs e) in d:\Visual Studio 2005\Projects\QAS\QAS\Forms\Edit\FRM_SqlEdit.cs:line 112
at System.Windows.Forms.Form.OnLoad(EventArgs e)
at System.Windows.Forms.Form.OnCreateControl()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.WmShowWindow(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ContainerControl.WndProc(Message& m)
at System.Windows.Forms.Form.WmShowWindow(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.SafeNativeMethods.ShowWindow(HandleRef hWnd, Int32 nCmdShow)
at System.Windows.Forms.Control.SetVisibleCore(Boolean value)
at System.Windows.Forms.Form.SetVisibleCore(Boolean value)
at System.Windows.Forms.Control.set_Visible(Boolean value)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
at System.Windows.Forms.Form.ShowDialog()
at QAS.FRM_Main.mitTolCnt_Click(Object sender, EventArgs e) in d:\Visual Studio 2005\Projects\QAS\QAS\Forms\Main\FRM_Main.cs:line 101
at System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
at System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e)
at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
at System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met)
at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
at System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ToolStrip.WndProc(Message& m)
at System.Windows.Forms.ToolStripDropDown.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at QAS.Program.Main() in d:\Visual Studio 2005\Projects\QAS\QAS\Program.cs:line 14
at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
Das passiert, wenn ich SqlAdapter.Fill aufrufe! Was ich nicht verstehe ist, dass ich gar keine Tabellen mit dem Namen "Table" habe. Der SelectCommand lautet "SELECT * FROM Country" und im DataSet habe ich eine Tabelle mit dem Namen Country... Wieso passiert denn dieser Fehler?
Gruss Ishildur
Hallo zusammen, ich frage mich, ob meine Implementation vom Event DataError so in Ordnung ist oder ob es da noch eine elegantere Möglichkeit gibt, um dasselbe zu erreichen...
// -------------------- event - handler for the event "dtaViw_DataError" --------------------
private void dtaViw_DataError(object sender,DataGridViewDataErrorEventArgs e) {
// declare and init local variables
String strErr = "";
// check if the exception is a constraint - exception
if(e.Exception.GetType() == typeof(ConstraintException))
// define the appropriate error - string
strErr = "Ein Land mit diesem Namen ist bereits vorhanden!";
// otherwise check if the exception is a null - exception
else if(e.Exception.GetType() == typeof(NoNullAllowedException))
// define the appropriate error - string
strErr = "Das Feld darf nicht leer sein!";
// inform the user about the error
MessageBox.Show(strErr,"Fehler",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
}
// ------------------------------------------------------------------------------------------
Vielen Dank auch Ishildur
Den habe ich doch bereits gepostet... 😉
Es ist folgende Zeile:
if(this.Site.DesignMode) return;
Meinst du sowas?
System.NullReferenceException was unhandled
Message="Object reference not set to an instance of an object."
Source="QAS"
StackTrace:
at QAS.FRM_SqlEdit.FRM_SqlEdit_Load(Object sender, EventArgs e) in d:\Visual Studio 2005\Projects\QAS\QAS\Forms\Edit\FRM_SqlEdit.cs:line 98
at System.Windows.Forms.Form.OnLoad(EventArgs e)
at System.Windows.Forms.Form.OnCreateControl()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.WmShowWindow(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ContainerControl.WndProc(Message& m)
at System.Windows.Forms.Form.WmShowWindow(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.SafeNativeMethods.ShowWindow(HandleRef hWnd, Int32 nCmdShow)
at System.Windows.Forms.Control.SetVisibleCore(Boolean value)
at System.Windows.Forms.Form.SetVisibleCore(Boolean value)
at System.Windows.Forms.Control.set_Visible(Boolean value)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
at System.Windows.Forms.Form.ShowDialog()
at QAS.FRM_Main.mitTolCnt_Click(Object sender, EventArgs e) in d:\Visual Studio 2005\Projects\QAS\QAS\Forms\Main\FRM_Main.cs:line 101
at System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
at System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e)
at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
at System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met)
at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
at System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ToolStrip.WndProc(Message& m)
at System.Windows.Forms.ToolStripDropDown.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at QAS.Program.Main() in d:\Visual Studio 2005\Projects\QAS\QAS\Program.cs:line 14
at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
Ich habe versucht, deine Idee folgendermassen zu implementieren, was leider eine NullReferenceException verursacht...
// -------------------- event - handler for the event "FRM_SqlEdit_Load" --------------------
private void FRM_SqlEdit_Load(object sender,EventArgs e) {
// check if the current site is in design - mode
if(this.Site.DesignMode) return;
// check if the properties aren't in a valid condition
if(this.sqlCon == null || this.sqlTrn == null) {
// prepare the message and throw an exception
String strExp = "The Connection or the Transaction has not been initialized";
throw new InvalidOperationException(strExp);
}
// open a try - statement as there may occur errors
try {
// get data from the sql - database
this.sqlAdp.Fill(this.dtaSet);
}
// define a catch statement for handling possible errors
catch(SqlException exp) {
// inform the user, close this window and return
new FRM_Exception(exp,this.sqlCon).ShowDialog();
this.Close();
return;
}
}
// ------------------------------------------------------------------------------------------
Hallo zusammen. Ich möchte gewisse Codesegmente für den Designer ausschliessen. Sprich, der Designer soll diese nicht ausführen. Wie mache ich denn dass?
Gruss Ishildur
Der Komplette Source von FRM_SqlEdit sieht so aus:
// ############################# declaration of the needed classes ############################
using System;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
// ############################################################################################
// ####################################### namespace QAS ######################################
namespace QAS {
// ************************************** class FRM_Edit *************************************
public partial class FRM_SqlEdit:FRM_Edit {
// ------------------------------------- private members ------------------------------------
protected SqlConnection sqlCon; // sql - connection
private SqlTransaction sqlTrn; // sql - transaction
private bool bOwnTrn; // flag to save wether this transaction is our own
// ------------------------------------------------------------------------------------------
// ---------------------------------- default - constructor ---------------------------------
public FRM_SqlEdit() {
// call the method for initializeing all components
InitializeComponent();
}
// ------------------------------------------------------------------------------------------
// ---------------------------------- custom - constructor ----------------------------------
public FRM_SqlEdit(SqlConnection sqlCon,SqlTransaction sqlTrn) {
// call the method for initializeing all components
InitializeComponent();
// initialize the needed properties
this.Connection = sqlCon;
this.Transaction = sqlTrn;
}
// ------------------------------------------------------------------------------------------
// --------------------- property - method for the property "Connection" --------------------
public SqlConnection Connection {
// define the set - statement
set {
// throw an exception if the connection is null
if(value == null) throw new ArgumentNullException();
// copy the value to the member and the data - adapter
this.sqlCon = value;
// assign the sql - connection to the commands
this.sqlAdp.SelectCommand.Connection = this.sqlCon;
this.sqlAdp.InsertCommand.Connection = this.sqlCon;
this.sqlAdp.UpdateCommand.Connection = this.sqlCon;
this.sqlAdp.DeleteCommand.Connection = this.sqlCon;
}
// define the get - statement
get {
// return the internal sql - connection
return this.sqlCon;
}
}
// ------------------------------------------------------------------------------------------
// -------------------- property - method for the property "Transaction" --------------------
public SqlTransaction Transaction {
// define the set - statement
set {
// throw an exception if the connection wasn't set first
if(this.sqlCon == null)
throw new InvalidOperationException("Connection must be set first");
// check if there was defined a transaction
if(value != null) {
// copy the transaction into the members ans enable the own - flag
this.sqlTrn = value;
this.bOwnTrn = false;
}
// otherwise
else {
// start a new serialized transaction and enable the own - flag
this.sqlTrn = this.sqlCon.BeginTransaction(IsolationLevel.Serializable);
this.bOwnTrn = true;
}
// assign the sql - transaction to the commands
this.sqlAdp.SelectCommand.Transaction = this.sqlTrn;
this.sqlAdp.InsertCommand.Transaction = this.sqlTrn;
this.sqlAdp.UpdateCommand.Transaction = this.sqlTrn;
this.sqlAdp.DeleteCommand.Transaction = this.sqlTrn;
}
// define the get - statement
get {
// return the internal sql - connection
return this.sqlTrn;
}
}
// ------------------------------------------------------------------------------------------
// -------------------- event - handler for the event "FRM_SqlEdit_Load" --------------------
private void FRM_SqlEdit_Load(object sender,EventArgs e) {
// throw an exception if the connection wasn't set first
if(this.sqlCon == null) throw new InvalidOperationException("Connection must be set first");
// open a try - statement as there may occur errors
try {
// get data from the sql - database
this.sqlAdp.Fill(this.dtaSet);
}
// define a catch statement for handling possible errors
catch(SqlException exp) {
// inform the user, close this window and return
new FRM_Exception(exp,this.sqlCon).ShowDialog();
this.Close();
return;
}
}
// ------------------------------------------------------------------------------------------
// ----------------- event - handler for the event "FRM_SqlEdit_FormClosing -----------------
private void FRM_SqlEdit_FormClosing(object sender,FormClosingEventArgs e) {
// check if the properties aren't in a valid condition
if(this.sqlCon == null || this.sqlTrn == null) {
// prepare the message and throw an exception
String strExp = "The Connection or the Transaction has not been initialized";
throw new InvalidOperationException(strExp);
}
// open a try - statement as there may occure an exception
try {
// check if the user pushed the OK - button
if(this.DialogResult == DialogResult.OK) {
// write all changes to the database and commit if this formular uses its own transaction
this.sqlAdp.Update(this.dtaSet);
if(this.bOwnTrn) this.sqlTrn.Commit();
}
// otherwise
else {
// reject all changes and rollback if this formular uses its own transaction
this.dtaSet.RejectChanges();
if(this.bOwnTrn) this.sqlTrn.Rollback();
}
}
// a constraint - rule has been violated
catch(ConstraintException) {
String strExp = "Dieser Wert ist bereits vorhanden in der Liste vorhanden";
MessageBox.Show(strExp,"Fehler",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
// a null value was inserted
catch(NoNullAllowedException) {
String strExp = "Dieses Feld darf nicht leer sein";
MessageBox.Show(strExp,"Fehler",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
// a low - level sql - exception occured
catch(SqlException exp) {
// inform the user and cancel the closing - operation
new FRM_Exception(exp,this.sqlCon).ShowDialog();
e.Cancel = true;
}
}
// ------------------------------------------------------------------------------------------
}
// *******************************************************************************************
}
// ############################################################################################
Gibt es vielleicht irgendeine Möglichkeit, Code zu definieren, welcher vom Designer nicht ausgeführt wird? So etwas wie eine Compilerinstruction?
Das Problem ist natürlich, dass der Designer den Std Ctor aufruft und die beiden Properties Connection und Transaction nicht!
Fill: SelectCommand.Connection property has not been initialized.
Hideat System.Data.Common.DbDataAdapter.GetConnection3(DbDataAdapter adapter, IDbCommand command, String method)
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
at QAS.FRM_SqlEdit.FRM_Edit_Load(Object sender, EventArgs e) in d:\Visual Studio 2005\Projects\QAS\QAS\Forms\Edit\FRM_SqlEdit.cs:line 100
at System.Windows.Forms.Form.OnLoad(EventArgs e)
at System.Windows.Forms.Form.OnCreateControl()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.SetVisibleCore(Boolean value)
at System.Windows.Forms.Form.SetVisibleCore(Boolean value)
at System.Windows.Forms.Control.set_Visible(Boolean value)
at System.Windows.Forms.Design.DesignerFrame.Initialize(Control view)
at System.Windows.Forms.Design.DocumentDesigner.Initialize(IComponent component)
at System.Windows.Forms.Design.FormDocumentDesigner.Initialize(IComponent component)
at System.ComponentModel.Design.DesignerHost.AddToContainerPostProcess(IComponent component, String name, IContainer containerToAddTo)
at System.ComponentModel.Design.DesignerHost.Add(IComponent component, String name)
at System.ComponentModel.Design.DesignerHost.System.ComponentModel.Design.IDesignerHost.CreateComponent(Type componentType, String name)
at System.ComponentModel.Design.Serialization.DesignerSerializationManager.CreateInstance(Type type, ICollection arguments, String name, Boolean addToContainer)
at System.ComponentModel.Design.Serialization.DesignerSerializationManager.System.ComponentModel.Design.Serialization.IDesignerSerializationManager.CreateInstance(Type type, ICollection arguments, String name, Boolean addToContainer)
at System.ComponentModel.Design.Serialization.TypeCodeDomSerializer.Deserialize(IDesignerSerializationManager manager, CodeTypeDeclaration declaration)
at System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager manager)
at Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager serializationManager)
at System.ComponentModel.Design.Serialization.BasicDesignerLoader.BeginLoad(IDesignerLoaderHost host)
Der folgender Fehler taucht nur im Designer auf, wenn ich den Code compilliere, läuft das Programm wie erwartet und einwandfrei... 🤔
Ja du hast Recht, die Tabelle heisst natürlich "Country"! Leider bleibt derselbe Fehler bestehen!
Jetzt habe ich die Scheisse sogar von Hand reingetan, aber es geht dennoch nicht!
this.sqlAdp.TableMappings.Add("Country_ID","Country_ID");
this.sqlAdp.Fill(this.dtaSet);
Missing the 'Table' DataTable for the 'Table' SourceTable.
Was soll denn dass? 🤔
Ein weiteres Problem: Ich beim DataAdapter das TableMapping überhaupt nicht durchführen, allerdings frage ich mich auch, weshalb dies überhaupt nötig ist, da die Namen der Tabellen im DataSet völlig identisch mit den Namen der Tabellen auf der SQL - Datenbank sind.
OK, aber ich habe da noch ein weiteres, weit gravierenders Problem.
Die Basisklasse enthält ein SqlAdapter, welchem ich jedoch erst in den Derived - Klassen die Kommandos zuordne. Nun ist es so, dass jedes Mal, wenn ich das Teil kompilliere, alles wieder weg ist! 8o So langsam aber sicher, sinkt der Beliebtheitsgrad des Designers bei mir!
Guten Abend
Ich habe folgendes Problem:
Constructor on type 'QAS.FRM_Edit' not found.
Hideat System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
at System.ComponentModel.Design.DesignSurface.CreateInstance(Type type)
at Microsoft.VisualStudio.Design.VSDesignSurface.CreateInstance(Type type)
at System.ComponentModel.Design.DesignerHost.System.ComponentModel.Design.IDesignerHost.CreateComponent(Type componentType, String name)
at System.ComponentModel.Design.Serialization.DesignerSerializationManager.CreateInstance(Type type, ICollection arguments, String name, Boolean addToContainer)
at System.ComponentModel.Design.Serialization.DesignerSerializationManager.System.ComponentModel.Design.Serialization.IDesignerSerializationManager.CreateInstance(Type type, ICollection arguments, String name, Boolean addToContainer)
at System.ComponentModel.Design.Serialization.TypeCodeDomSerializer.Deserialize(IDesignerSerializationManager manager, CodeTypeDeclaration declaration)
at System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager manager)
at Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager serializationManager)
at Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.DeferredLoadHandler.Microsoft.VisualStudio.TextManager.Interop.IVsTextBufferDataEvents.OnLoadCompleted(Int32 fReload)
Dies passiert, nachdem ich ein Form von einem anderen Form ableiten, welchen keinen Default - Konstruktor besitzt! Woran liegt das. Das Form kann nun mal keinen Default - Konstruktor haben!
Gruss Ishildur
warum liest Du dann nicht was dazu?
Und wo denn? Die einzige Literatur, welche ich zu diesem Thema finden beschränkt sich auf das einfache Auslesen von einem Datensatz. Mein ERD behaltet ca. 60 Tabellen, dann wird das Ganze schon etwas anspruchsvoller und dazu kann ich keine Literatur finden. Es ist anscheinend nicht einmal möglich, die Datentypen von T-SQL 2005 zu ermitteln:
Google findet gerade mal 14 Einträge für den Suchbegriff "T-SQL Datatypes"! 🤔
"T-SQL Datatypes": 14 Einträge
"TSQL Datatypes": 16 Einträge
"MSSQL Datatypes": 70 Eintäge
"MS SQL Datatype": 74 Einträge
"T-SQL Datentypen": 2 Einträge
zum Vergleich:
"MySQL Datatypes": 2'900 Einträge
Also, erzählt mir doch nichts von nachlesen. Ich bin nicht zu faul zum Lesen, aber wenn man ne knappe Stunde braucht, um eine Liste der T-SQL Datentypen zu finden, dann kann einem das echt die Laune verderben. Eine List der MySQL Datentypen finde ich innerhalb von 5 Sekunden... 😜
Neinnein, ich möchte die Commands selber schreiben, da diese in der Regel etwas komplizierter sind. 1:n und n:m Beziehungen und so! Ich habe bspw. folgenden Code:
// define create and execute a select - command
String strSel = "SELECT * FROM Person ORDER BY Prename ASC;";
strSel += "SELECT * FROM Country ORDER BY Name ASC";
this.sqlAdp.SelectCommand = new SqlCommand(strSel,this.sqlCon);
// define and create an insert - command
String strIns = "INSERT INTO Person(Title,Name,Prename,Birthdate,Zivilstate,Profession,";
strIns += "AHV,Conto,Bank,Picture,Adress,Zip,Place,Postcase,Country_ID,TelBusi,TelPriv,";
strIns += "FaxBusi,FaxPriv,MobBusi,MobPriv,MailBusi,MailPriv,Website) ";
strIns += "VALUES(@Title,@Name,@Prename,@Birthdate,@Zivilstate,@Profession,@AHV,@Conto,";
strIns += "@Bank,@Picture,@Adress,@Zip,@Place,@Postcase,@Country_ID,@TelBusi,@TelPriv,";
strIns += "@FaxBusi,@FaxPriv,@MobBusi,@MobPriv,@MailBusi,@MailPriv,@Website)";
this.sqlAdp.InsertCommand = new SqlCommand(strIns,this.sqlCon);
// define and create an update - command
String strUpd = "UPDATE Person SET Title = @Title,Name = @Name,Prename = @Prename,";
strUpd += "Birthdate = @Birthdate,Zivilstate = @Zivilstate,Profession = @Profession,";
strUpd += "AHV = @AHV,Conto = @Conto,Bank = @Bank,Picture = @Picture,Zip = @Zip,";
strUpd += "Adress = @Adress,Place = @Place,Postcase = @Postcase,Country_ID = @Country_ID,";
strUpd += "TelBusi = @TelBusi,TelPriv = @TelPriv,FaxBusi = @FaxBusi,FaxPriv = @FaxPriv,";
strUpd += "MobBusi = @MobBusi,MobPriv = @MobPriv,MailBusi = @MailBusi,";
strUpd += "MailPriv = @MailPriv,Website = @Website WHERE Person_ID = @Person_ID";
this.sqlAdp.UpdateCommand = new SqlCommand(strUpd,this.sqlCon);
// define and create a delete - command
String strDel = "DELETE FROM Person WHERE Person_ID = @Person_ID";
this.sqlAdp.DeleteCommand = new SqlCommand(strDel,this.sqlCon);
Alles, was ich möchte, ist, dass die Laufzeitumgebung für jede Variable des entsprechenden Commandos einen passenden Parameter definiert, das kann doch nicht so schwer sein? 8o
Ja, aber MapType kennt mein compiler anscheinend nicht!
Was sind denn OR - Mapper? Und wieso sollte ich dies nicht automatisch haben wollen? ist doch immer genau derselbe Code?
Ich habe einfach irgendwie immer noch ein grundlegendes Verständniss - Problem mit ADO. NET
SqlCmd.Parameters.Add( "@"+dc.Caption, MapType(dc.DataType), dc.ColumnName);
Also irgendwie stehe ich auf der Leitung:
Lg Ishildur
Ja, lassen wir das mit den deaktivierten Controls, ich habe nun ein ganz anderes Problem: Wenn ich die Show Methode der ToolTip Klasse von Hand aufrufe, dann bleibt das Ding genauso lange da, wie ich im Duration Parameter definiert habe. Ich möchte aber, dass die Box verschwindet, sobald ich den Mauszeiger bewege, eigentlich so, wie es auch bei den konventionellen Tooltips ist. Wie stelle ich denn das an?
Scheisse, das geht auch nicht, den GetChildAtPoint gibt mir die GroupBox zurück, anstatt das effektive Control!
Du bist ein Genie!
Ich hatte bereits versucht, den Event einfach an die Controls anzuhängen, aber dann funktionierten die deaktivierten Controls nicht mehr!
Neinnein, jetzt verstehe ich warum, weil das Parent - Window den Event wirft, aber wie kann ich nun herausfinden, für welches Control es gedacht war? In den HelpEventArgs steht nicht darüber!
Das habe ich natürlich schon getan und das Resultat ist ein leerer String, aber wieso ? Da macht doch keinen Sinn?
Hallo zusammen
Ich möchte im HelpRequested - Event einen Tooltip anzeigen, allerdings habe ich damit meine Probleme.
private void FRM_SelectPicture_HelpRequested(object sender,HelpEventArgs hlpevent) {
Control ctl = (Control)sender;
this.toltip.Show(this.toltip.GetToolTip(ctl),ctl,ctl.PointToClient(hlpevent.MousePos));
}
Es wird einfach gar nichts angezeigt. Wenn ich this.toltip.GetToolTip(ctl) mit einem manuellen String ersetze, funktioniert alles bestens.
Woran könnte das liegen? Der Tooltip für das entsprechende Control wurde vorher mit this.toltip.SetToolTip(this.pbxOri,resources.GetString("pbxOri.ToolTip")); festgelegt!
Hallo zusammen
In C gab es eine Funktion
HFONT hFnt = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
Gibt es sowas auch in C# ?
Neinnein
Wenn ich z.B. ein Bild 100px auf 75px habe und die TextureBox hat 200px auf 200px und der DisplayMode ist auf Zoom gestellt, dann erscheint links und recht ein Rand. Das Bild in der PictureBox ist also kleiner als die PictureBox selbst. Natürlch kann ich von Hand ausrechnen, wie gross der margin links und rechts ist, doch ist dies eben ziemlich aufwändig!
Naja, da hast du schon recht, aber manchmal finde ich einfach die passende Funktion nicht und möchte es auch nicht von Hand programmieren, nur um am Ende festzustellen, dass es eine Funktion oder ein Objekt gegeben hätte, welche genau dies erledigt hätte.
Ich hätte da gleich noch eine Frage. Wenn ich ein Image in eine PictureBox lade, dann kann es ja vorkommen, dass das Bild da nicht reinpasst. Gibt es eine Möglichkeit, das Rechteck des Bereiches der PictureBox zu erhalten, welcher effektiv mit Bilddaten gefüllt ist?