hat noch niemand versucht, Databinding auf diese Weise zu verwenden?
Da ich bereits die nächste Maske in meinem Programm habe, die ebenfalls mehrere Datensätze einer Tabelle darstellen soll, ohne eine DataGridView zu verwenden, scheint mir das doch ein häufigeres Problem zu sein.
ich würde gerne die Inhalte einer Tabelle (jeder Eintrag besteht aus einem Text und einem booleschen Wert), an eine View binden. Es sollen - wie bei einem DataGridView - alle Einträge auf der Seite dargestellt werden. Allerdings würde ich gerne einfach nur CheckBoxen in mehreren Spalten nebeneinander darstellen. anstatt ein DataGridView-Control zu verwenden. Das ganze soll ungefähr so aussehen:
Text1 [] Text2 [] Text3 []
Text4 [] Text5 [] Text6 []
Text7 [] Text8 []
Das dynamische Erzeugen der CheckBoxen ist ja kein Problem. Problematisch ist aber, dass ich immer nur einen Datensatz an die View binden kann. Aktuell steht z.B. in allen CheckBoxen Text1 und sie sind entweder alle selektiert oder nicht.
Gibt es eine Möglichkeit, jeweils eine Tabellenzeile an eine CheckBox zu binden?
So weit, dass ein Fehler in einem der .NET-DB-Zugriffs-Klassen auftreten könnte, bin ich noch gar nicht. Der Fehler stammt direkt von der Datenbank. Er wird auch ausgegeben, wenn ich das Statement direkt auf der Datenbank-Konsole ausführe.
ich habe mich in letzter Zeit mit anderen Projekten beschäftigt, und dieses Problem hinten angestellt. Mittlerweile ist es aber wieder akut. Deshalb wollte ich noch einmal nachfragen, ob jemand eine Lösung des Problems für SQLite weiß oder zumindest eine Idee hat, warum SQLite die Lösung von Andre nicht annimmt.
Original von herbivore
Es lohnt nicht, das auf Verdacht oder gut Glück zu tun.
Da kann ich zustimmen. C/C++ zu lernen würde dann Sinn machen, wenn Du laufzeitkritische Dinge programmieren willst. Oder Programme für Systeme schreibst, die wenig Resourcen zur Verfügung haben.
Java unterscheidet sich von C# hauptsächlich darin, dass hinter C# ein viel größeres Framework steckt, während man bei Java viele Fremdbibliotheken benötigt. Erst wenn Du in den Bereich Webentwicklung gehst, gibt es große Unterschiede aufgrund der Vielzahl an Frameworks für die Webentwicklung mit Java.
Ach ja, Java-GUIs sind mittlerweile nicht mehr zwangsläufig hässlich, wie regen gemeint hat.
Hallo, ich bin seit langer Zeit auch mal wieder hier.
Ich setze in meinem Programm einen HttpListener ein, der eine Konfigurationswebseite anzeigt. Man kann auf der Webseite einige Dinge ändern und nach erfolgreicher Änderung der Konfiguration zeigt eine Webseite den Erfolg an.
In unregelmäßigen Abständen (manchmal bereits beim ersten Aufruf der Konfig-Webseite, manchmal erst beim fünften) wird eine HttpListenerException geworfen.
Könnt ihr nachvollziehen, woran das liegt?
Der Code sieht folgendermaßen aus:
/// <summary>
/// Startet einen lokalen, programminternen Webserver, der an den uebergebenen URLs lauscht.
/// </summary>
/// <param name="urls">URLs, die ueberwacht werden sollen. Es werden die uebergebenen URLs
/// und alle untergeordneten URLs beobachtet</param>
private static void listenAt(string[] urls) {
if (!HttpListener.IsSupported) {
log.Warn("Die bequeme Konfiguration ueber den Webbrowser " +
"funktioniert nur unter Windows XP SP2 or Server 2003.");
return;
}
if (urls == null || urls.Length == 0) {
log.Warn("Es wurde keine Konfigurations-Webseite registriert. " +
"Sie koennen das Programm somit nur ueber direktes " +
"Bearbeiten der config.xml-Datei konfigurieren.");
return;
}
// Existiert bereits ein Listener? Dann diesen zunächst killen
if (httpListener != null) {
httpListener.Stop();
}
// Neuen Listener erzeugen und alle URL-Prefixes hinzufuegen
httpListener = new HttpListener();
foreach (string url in urls) {
httpListener.Prefixes.Add(url);
log.Info("Der HTTP-Listener wird gestartet und wartet auf Anforderungen " +
"der Konfigurations-Webseite unter " + url + "config");
}
try {
httpListener.Start();
while (true) {
// Note: The GetContext method blocks while waiting for a request.
HttpListenerContext context = httpListener.GetContext();
HttpListenerRequest request = context.Request;
if (request.Url.AbsoluteUri.Contains("close")) {
// Die URI enthaelt "close", wenn die Konfiguration bearbeitet wurde
bool configChanged = false;
// Lesen der eingegebenen Daten
Stream body = request.InputStream;
StreamReader reader = new StreamReader(body, Encoding.UTF8);
String newConfig = reader.ReadToEnd(); // HIER TRITT DER FEHLER AUF
configChanged = appSettings.updateConfig(newConfig);
// Bestaetigung anzeigen, ob Konfiguration geaendert wurde
HttpListenerResponse response = context.Response;
// Construct a response.
string responseString = appSettings.createConfigChangeResultPage(configChanged);
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
// Get a response stream and write the response to it.
response.ContentLength64 = buffer.Length;
System.IO.Stream output = response.OutputStream;
output.Write(buffer,0,buffer.Length);
output.Flush();
output.Close();
response.Close();
body.Close();
reader.Close();
// TODO: Wie kann man hier den Request schließen? In der MSDN steht:
// If you are finished with the request, it should be closed also.
}
else if (request.Url.AbsoluteUri.Contains("config")) {
// Die URI enthaelt "config", wenn die Konfigurationswebseite angezeigt werden soll
HttpListenerResponse response = context.Response;
// Construct a response.
string responseString = appSettings.createConfigPage();
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
// Get a response stream and write the response to it.
response.ContentLength64 = buffer.Length;
System.IO.Stream output = response.OutputStream;
output.Write(buffer,0,buffer.Length);
output.Flush();
output.Close();
}
}
}
catch (Exception ex) {
log.Error(ex.ToString());
}
finally {
httpListener.Stop();
}
}
Folgende Exception wird an der Stelle "HIER TRITT DER FEHLER AUF" gefeuert:
System.Net.HttpListenerException: Es wurde versucht, auf eine nicht vorhandene N
etzwerkverbindung zuzugreifen
at System.Net.HttpRequestStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at System.IO.StreamReader.ReadBuffer()
at System.IO.StreamReader.ReadToEnd()
at StockQuoteFilter.App.listenAt(String[] urls) in c:\Dokumente und Einstellu
ngen\Admin\Eigene Dateien\SharpDevelop Projects\StockQuoteFilter\App.cs:line 397
Hast Du das Problem mittlerweile gelöst?
Ich sehe die Stelle in Deinem Statement nicht, wo der Parameter eingefügt wird und die Geschichte mit dem Value kapiere ich auch nicht.
Du meinst wohl eher so etwas:
OdbcDataAdapter odbcadapter = new OdbcDataAdapter("select * from news where startdate between @p1 and now() and enddate ≥ now()", connection);
odbcadapter.SelectCommand.Parameters.Add("@p1", startDate);
Wie ist es in SQL möglich, den Wert eines Feldes mit einem Substring dieses Wertes zu ersetzen.
In meiner Datenbank stehen zur Zeit für Farbangaben Werte wie 0x123456 oder 0xFFFFFF in der Spalte Color. Ich würde daraus gerne 12345 und FFFFFF machen.
Folgender Versuch hat nicht funktioniert:
create table temp(id integer, newcolor varchar(6), color varchar(8));
INSERT INTO temp SELECT id, substr(color, 3, 6) AS newcolor, color FROM ingredient_juice;
UPDATE ingredient_juice SET color = (SELECT newcolor FROM temp WHERE ingredient_juice.id = temp.id);
Ich nehme mal an, dass die WHERE-Klausel des Updates das Problem ist, weiß aber keinen besseren Weg.
Habt Ihr bessere Ideen - evtl. auch ohne temporäre Tabelle?
Ach ja, ich verwende SQLite - es steht also kein TSQL oder so zur Verfügung.
Ok, ich habe mittlerweile den Grund für das falsche Verhalten gefunden.
Es handelt sich bei dem beschriebenen Verhalten offenbar um einen Bug. Sobald eine ComboBox irgendwo anders als in der höchsten Menüebene hinzugefügt wird, so zeigt sie keine Daten an, die per DataSource an das Control gebunden wurden.
Die einzige Möglichkeit, das ganze zu umgehen, ist es, die Daten "per Hand" in die ComboBox einzutragen.
Da hast Du Recht. Das passiert dann, wenn man versucht, für das Beispiel einfachere Variablennamen zu erzeugen. Habe es geändert.
Aber nun sind unsere Beispiele gleich und wie gesagt, bei mir geht das so nicht (die ComboBox bleibt leer). Bist Du sicher, dass es funktionieren müsste?
Ich möchte an eine ToolStripComboBox eine DataTable binden.
Die ToolStripComboBox selber hat ja keine DataSource-Eigenschaft, sie besitzt jedoch eine ComboBox-Eigenschaft, die wiederum DataSource besitzt.
Leider bleibt die ComboBox aber bei folgendem Code leer:
DataTable dt = IngredientDal.getAllIngredientsAsDataTable(IngredientType.Juice);
// dt enthält Einträge: Console.WriteLine(dt.Rows.Count) gibt 90 aus
this.toolStripComboBox.ComboBox.DataSource = dt;
// Ingredientname und ID kommen in der DataTable vor
this.toolStripComboBox.ComboBox.DisplayMember = "Ingredientname";
this.toolStripComboBox.ComboBox.ValueMember = "ID";
Hat jemand von Euch schonmal eine DataTable an eine ToolStripComboBox gebunden und kann mir sagen, wie das geht?
Das würde nur bei einer statischen Klasse funktionieren.
Bei nicht statischen Klassen musst Du zunächst ein Objekt anlegen und auf diesem die Methode aufrufen.
Class1 objektVonClass1 = new Class1();
objektVonClass1.MyVoid();
vielen Dank, der Ausdruck sieht ja schonmal ziemlich beeindruckend aus und ich habe ihn wohl mittlerweile auch verstanden. Allerdings bekomme ich den Fehler:
no such column: d.Ingredient_ID (es ist kein Schreibfehler, bei mir heißt die Spalte Ingredient_ID mit "_")
Dabei enthält die Tabelle, auf die die Bedingung angewendet wird, sehr wohl eine solche Spalte. Evtl. liegts daran, dass SQLite Probleme mit zu vielen JOINs hat. Weiß da jemand etwas drüber?
Dass es mehrere Zutaten mit der gleichen Menge geben kann ist mir klar, allerdings ist es mir dort egal, welche ausgewählt wird. Da müsste ein einfaches GROUP BY Cocktailname reichen.
Ich hätte also gerne den Cocktailnamen aus Cocktail, die Menge aus Insertion_Juice und den Namen der Zutat aus Ingredient_Juice - so weit kein Problem, allerdings gibt es auch Cocktails, die keinen Saft enthalten, deren ID also in Insertion_Juice gar nicht auftaucht. Diese sollen allerdings auch angezeigt werden (Problem I). Außerdem soll - als Schmankerl so zu sagen - nur immer ein Saft pro Cocktail angezeigt werden und zwar der mit dem höchsten Wert bei Quantity (Problem II).
Das Programm, dass u.a. diese SQL-Abfrage enthält, gabs schonmal als WinApi-Version und da hatte ich mit vielen temporären Datenbank-Tabellen gearbeitet, aber das würde ich dieses Mal gerne umgehen.
Mein Statement sieht bislang so aus - die beiden Probleme werden dadurch aber nicht gelöst.
SELECT Cocktailname, insertion_juice.Quantity, ingredient_juice.Ingredientname
FROM cocktail LEFT JOIN insertion_juice ON cocktail.ID = insertion_juice.Cocktail_ID
JOIN ingredient_juice ON ingredient_juice.ID = insertion_juice.Ingredient_ID
Mh, also das ist eine ziemlich grundlegende Frage für alle OO-Sprachen. Ich nehme also an, dass Deine bisherigen Programmiererfahrungen keine Objektorientierung umfassen. Deshalb solltest Du Dir schon ein buch zum thema gönnen.
Zu Deiner Frage: Ohne den näheren Verwendungszweck zu kennen, würden mir folgende Möglichkeiten einfallen:
- Die Klasse (geht erst ab .NET 2.0) oder zumindest ihre Methoden und Properties (geht auch schon vor .NET 2.0) statisch machen, dann kannst Du von überall auf ihre Methoden und Properties zugreifen, wenn Du ihren Namespace inkludiert hast
- Ein Objekt von Class1 in Form1 erzeugen und dieses verwenden
- Eine zentrale Klasse erzeugt sowohl ein Objekt von Class1 als auch alle Formulare und übergibt diesen das Class1-Objekt
Da waren wohl die falschen Nutzer online :-)
Ich fand den Link auch immer sehr praktisch (eigentlich mein einziger Einstiegspunkt neben der Suchfunktion). Warum ist der denn verschwunden? Und hilft es, wenn wir ganz lieb darum bitten, dass er zurück kommt?
Ich wollte mein Programm aus Lerngründen mehrsprachig machen. In meinem C#-Buch steht, dass man zunächst ne txt-Datei mit allen Strings erzeugen und dann durch den Resource File Generator "resgen" in eine resX-Datei daraus generieren soll. Leider bekomme ich bei einem Aufruf über die Kommandozeile die Fehlermeldung, dass resgen nicht vorhanden sei. Resgen scheint auch auf der gesamten Platte nicht vorhanden zu sein - wo sollte sich diese Datei im Normalfall denn befinden?
also ne ArrayList halte ich nicht für besonders optimal. Wenn man mit C# anfängt und man von der Generics-Syntax verwirrt wird, dann hat sie evtl. eine Berechtigung. Sonst bin ich der Meinung, dass man (unter .NET2.0) möglichst selten die gute alte ArrayList benutzen sollte.
Eine generische Liste hat zum einen der Vorteil, dass sie typsicher ist (d.h. der Compiler meckert, wenn Du etwas anderes als den erwarteten Typ hinzufügen willst) und zum anderen muss keine Konvertierung vorgenommen werden.
Und wenns schnell gehen soll und trotzdem typsicher sein muss, dann - wie gesagt - bei Strings die StringCollection verwenden. Die hat allerdings keine sort-Methode.
Da gabs gerade erst einen Thread zu. Dort wird zwar keine Lösung vorgestellt, aber ein Link auf pdfSharp angegeben: PDFSHARP wie einbinden? - vielleicht hilft Dir das ja.
Das ist aber ein sehr allgemeiner Wunsch. Weshalb wohl auch noch keiner geantwortet hat. Wofür benötigst Du denn eine Anleitung? Für das Erstellen der Anwendung? Der Datenbank? Das Anbinden der Datenbank? Das Ausführen der Anwednung auf anderen Rechnern? Den Abgleich mit dem Server (was stellst Du Dir da genau vor)?
Also ich finde die Exceptions in der Regel ziemlich eindeutig und mit aussagekrätigen Fehlermeldungen versehen. Es mag Ausnahmen geben, aber dass in der MSDN mehr drinsteht liegt in der Natur der Sache. Und natürlich schadet es nie, spätestens bei einem Fehler (meistens auch schon früher) einen Blick in die MSDN zu werfen.