Hi Svenson,
Hab ich gemacht
Hab ich gemacht
Active Sync ist gestartet und läuft. Damit hab ich ja die Applikation auf den PDA übertragen.
Da ich die Applikation als "Pocket PC 2003" Projekt angelegt habe sollte sie ja auf Windows CE 4.20 laufen.
Tut leider alles nicht.
naja, wollte mir eh nen neuen PDA kaufen, der hat dann Windows Mobile 2005. oder 5.0. oder wie das heisst.
Trotzdem Danke für Hilfe,
Grüße Bernd
Am Ende muss z.B. stehen :
seite++;
e.HasMorePages = (seite<seitenzahl);
seitenzahl muss vorher berechnet werden.
Grüße Bernd
Das Ducken von mehrseitigen Dokumenten ist nicht so to toll gelöst in Dot.Net. Ich habe in Version 2.0 auf Besserung gehofft, aber war leider nix dabei.
😦
Beim Aufruf des Drucks wird ja deine PrintPage-Funktion aufgerufen.
Wenn noch eine Seite kommt dann setze am Ende e.HasMorePages = true.
In diesem Fall wird die PrintPage-Funktion ein weiteres Mal aufgerufen.
Die Seitenzahl hochzählen und die richtigen Elemente drucken musst Du selbst machen.
Wenn nichts mehr zu Drucken ist setzte e.HasMorePages auf false.
Grüße Bernd
Hallo,
jetzt wollte ich mal probieren ein Programm für einen Pocket PC zu schreiben.
Mein TestProgramm enthält nur ein Form mit einem Button, der das Programm schließt. Also nichts wirklich schwieriges.
Mit <F5> kommt zwar ein simulierter PDA auf dem Bildschirm, mein Form kann ich aber nirgends entdecken. Nach ein paar Klicks auf dem simulierten PDA kommt immer die Fehlermeldung
Fehler 1 Fehler bei der Bereitstellung und/oder Registrierung: 0x8973190e. Fehler beim Schreiben der Datei "\Windows\NETCFV2.ppc.armv4.cab". Fehler 0x80070020: Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.
Device Connectivity Component
Wenn ich die Anwendung auf meinen PDA mit Windows CE 4.2, also Windows Mobile 2003 kopiere, dann erscheint beim Aufruf kurz eine Sanduhr und dann passiert nichts mehr.
Ich habe sowohl ein Windows CE 5.0 als auch ein Pocket PC 2003 Projekt angelegt.
Das Dot-Net Compact Framework lässt sich auf dem PDA leider nicht installieren, es kommt die Meldung "Dem Programm ist keine Anwendung zugeordnet".
Was muss ich tun damit ein selbst erstelltes Programm auf dem Pocket PC läuft ?
Grüße Bernd
PS.: Ich wäre auch für ein eigenes Forum für Pocket PC's, denn die Programmierung hat ja wenig mit einem normalen PC zu tun.
Ja, klar geht das, das sieht dann so aus :
NewDataSet.adRow ad = ds.Adressen[0];
string name = ad.Name;
So klappts gut und lässt sich auch gut lesen.
Danke FZelle,
Grüße Bernd
Hallo FZelle,
nein, das new hatte ich übersehen.
Nun klappt es, juchhu !
Meine Routine sieht jetzt so aus :
string sqlstr = "SELECT * FROM ad WHERE ad_nr = '10000'";
// Typisiertes Dataset
NewDataSet ds = new NewDataSet();
int anz = DatensatzLesen("Adressen", ds, sqlstr);
NewDataSet.adRow ad = (NewDataSet.adRow) ds.Tables["Adressen"].Rows[0];
string name = ad.Name;
Kann man die vorletzte Zeile noch vereinfachen ?
Besten Dank !
Grüße Bernd
In MS SQL kann man den Typ so abfragen :
try { ftyp = ds.Tables[dat].Columns[fname].DataType.ToString(); }
catch { ftyp = ""; }
if (fname != "")
{
if (ftyp == "System.String") ...
if (ftyp == "System.Double") ....
if (ftyp == "System.Boolean") ...
if (ftyp == "System.Int32") ...
if (ftyp == "System.DateTime") ...
}{
Ich denke dass es in MySQL genauso geht, denn die Datasets sind ja providerunabhängig.
Grüße Bernd
Hi FZelle,
ich hab das mal so programmiert wie von dir vorgeschlagen :
Ohne ref vor dem Dataset erhalte ich nach dem Aufruf von "DatensatzLesen" kein gefülltes Dataset zurück, es ist leer. Ich kann also auf die gelesenen Daten nicht zugreifen.
Mit ref erhalte ich die Fehlermeldung '2-Argument: kann nicht von "ref NewDataSet" in "ref System.Data.DataSet" konvertiert werden.'
Klappt leider nicht 😦
Grüße Bernd
Meine Idee geht leider doch nicht, es kommt folgender Fehler :
Das Objekt des Typs System.Data.DataRow kann nicht in Typ adRow umgewandelt werden.
Also doch mit nicht typisierten Datasets arbeiten, oder ?
Grüße Bernd
Ich hab da mal so ne Idee : Man könnte ja auch typisierte und nicht typisierte Datasets mischen. Bei denn allgemeinen Operationen nimmt man nicht typisierte und wenn man auf die einzelnen Spalten zugreifen will nimmt man eine typisierte Zeile :
NewDataSet.adRow ad = (NewDataSet.adRow) ds.Tables["Adressen"].Rows[0];
string name = ad.Name;
Hab die obigen Zeilen nicht getestet, müssten aber funktionieren.
Grüße Bernd
lowrider : BackgoundWorker gibt es erst in VS 2005.
Threads und Application.DoEvents() gibt es natürlich schon in VS 2003.
Grüße Bernd
Ohne Select-Kommando geht nicht.
Du kannst aber ein Select-Kommando nehmen, das keine Datensätze findet.
Beispiel : select * from Adressen where Postleitzahl = -99999
Grüße Bernd
Hallo,
bisher habe ich die meisten Programme mit untypisierten Datasets geschrieben. Ich möchte nun typisierte Datasets verwenden, da diese einige Vorteile bieten :
Meine erste Frage : Wie erstelle ich die typisierten Datasets am besten ?
Per Wizard oder per Befehl "WriteXmlSchema" und Aufruf von XSD.EXE ?
Gibt es unter Visual Studio 2005 noch andere Möglichkeiten ?
Hinweis : Ich arbeite nicht gerne mit Wizards, lieber tippe ich Code und versuche den zu verstehen.
Zweite Frage :
Ich habe einige Routinen die unabhängig von der Tabelle Operationen ausführen. Wie kann ich diese so umschreiben dass sie mit typisierten Datasets arbeiten ?
Mit untypisierten Datasets :
SqlConnection conn = null;
DataSet ds = null;
string sqlstr = "SELECT * FROM Adressen WHERE Adressnummer = 10000";
DatensatzLesen("Adressen", ref conn, ref ds, sqlstr);
string name = (string) ds.Tables["Adressen"].Rows[0]["Name"];
VerbindungSchliessen(ref conn);
Wie sieht das Ganze nun für typisierte Datasets aus ?
Die Funktionen sollen natürlich mit jeder Tabelle funktionieren.
Lohnt es sich überhaupt bei einer Applikation mit über 100 Tabellen typisierte Datasets zu verwenden ? Oder ist der Pflegeaufwand bei Tabellenänderungen zu groß ? Braucht das Programm dann mehr Resourcen ? Es werden ja immer zigtausend Zeilen Sourcecode für die typisierten Datasets erzeugt.
Grüße Bernd
Man kann mit einem DataAdapter und einem Dataset 2 Tabellen laden, ändern und zurückspeichern.
Aber : Der Commandbuilder kann immer nur eine Tabelle.
Also muss man vorm Speichern jeder Tabelle den SQL-Befehl ändern und den Commandbuilder neu aufrufen.
Ich hatte dieses Problem und hab lange dran geknabbert. Aber jetzt tuts :
da.SelectCommand.CommandText = "SELECT * FROM " + dat;
cb = new SqlCommandBuilder(da);
count = da.Update(ds, dat);
Die obigen drei Zeilen werden pro Tabelle aufgerufen.
Ich hoffe das hilft.
Server listen und in Listview anzeigen (nur in Dot.NET 2.0) :
lviServerliste.View = View.Details;
lviServerliste.Columns.Clear();
lviServerliste.Columns.Add("Servername", 200, HorizontalAlignment.Left);
lviServerliste.Items.Clear();
lviServerliste.Enabled = false;
ListViewItem lvItem;
SqlDataSourceEnumerator num = SqlDataSourceEnumerator.Instance;
DataTable dt = num.GetDataSources();
foreach (DataRow row in dt.Rows)
{
lvItem = new ListViewItem(row[0].ToString());
lviServerliste.Items.Add(lvItem); // Items zum ListView hinzufügen
}
lviServerliste.Enabled = true;
Wie man die Datenbanken pro Servr listet weiss ich noch nicht. Programmier Du das mal und poste es hier, ich brauche es nämlich auch.
Grüße Bernd
Wenn man hinter eine Firewall sitzt muss man bei FTP oft den Passiv-Mode einstellen.
Geht das auch in C# mit FtpWebRequest/FtpWebResponse ?
Grüße Bernd
Hi Unreal,
in meinem Fall dauert der Import eines Datensatzes nur einen Bruchteil einer Sekunde, die Applikation kann also schnell genug auf alle Ereignisse reagieren.
Der gesamte Import dauert natürlich länger, das können schon einige Stunden sein.
BackgroundWorker sind wohl einfacher zu implementieren als Threads, obwohl sie ja fast das gleiche tun.
Und man kann sie im Designer aus der Toolbox auf die Applikation ziehen 😉
Das scheint wohl wichtig zu sein.
Es gibt noch genügend Anwendungen wo die Vorgänge länger dauern oder parallel ablaufen sollen und ich mich dann doch mit Threads beschäftigen muss, z.B. Emailversand an 100 Leute gleichzeitig (Newsletter), umfangreiche Datenbankabfragen oder Dateien kopieren.
Grüße Bernd
Für meine Anforderung habe ich eine einfache Lösung gefunden :
Application.DoEvents();
in der Hauptschleife genügt, da ein einzelner Import recht schnell geht. Es können nur einige Tausend bis Millionen Datensätze sein.
ProgressBar und Abbruch-Button funktionieren wunderbar.
Die BackgroundWorker hab ich mit trotzdem angesehen weil ich sie für andere Sachen brauchen werde.
Grüße Bernd
Bei der Suche nach den genannten Suchworten hab ich festgestellt dass wohl jeder mal dieses Problem hat 😉
Ich habe 3 Beispiele zu BackgroundWorker gefunden, die werde ich mir mal anschauen und dann probieren ob ich das damit hinkriege :
http://www.stim.de/index.php?id=185
Dass Leerzeichen nicht mitgezählt werden hab ich auch schon bemerkt. Also hab ich einen Punkt davor und dahinter gemacht, die Länge gemessen und dann die Länge von den 2 Punkten wieder abgezogen. Nun klappts bei mir :
zlen = e.Graphics.MeasureString("."+zl2+".",txtfont2).Width-e.Graphics.MeasureString("..",txtfont2).Width;
Grüße Bernd
Das hab ich befürchtet, das man da was mit Threads machen muss.
😉
Dann werde ich mich mal damit beschäftigen.
Danke für die Infos und einen schönen Tag noch,
Bernd
Ich starte einen Datenimport durch Klick auf einen Button. Den Fortschritt zeige ich mit einer ProgressBar an.
Beim Import wird die ProgressBar durch den Befehl ProgressBar1.Refresh(); aktualisiert.
Wenn ich nun auf das Fenster klicke oder es mal im Hintergrund war wird es nicht mehr aktualisiert und das Fenster bekommt den Zusatz "(Keine Rückmeldung)".
Wie kann ich bewirken, dass die ProgressBar auch nach Mausklicks aktualisiert wird ?
Wie kann ich bewirken dass ich den Vorgang durch Klick auf einen Button abbrechen kann ?
Wenn ich vor dem Import die Dateien leere mit einem SQL-Befehl dann dauert dass eine Weile. Kann ich in dieser Zeit auch was anzeigen bzw. Abbrechen ermöglichen ?
Fragen über Fragen 😉
Grüße Bernd
Hallo Vernichter,
hier ist ein Beispiel mit 2 Tabellen und 2 Datagrids mit einem Dataset. Zwar in Basic, aber das Prinzip kann man gut erkennen.
Programmhans : Du weisst ich bin sparsam mit Datasets
😉
Grüße Bernd
Hi,
ich habs selbst rausgefunden :
Vor dem Befehl da.Update habe ich eingefügt :
cb.Dispose();
da.SelectCommand.CommandText = "SELECT * FROM "+dat;
cb = new SqlCommandBuilder(da);
Jetzt wird vor jedem Einfügen eines neues Datensatzes der Insert-String neu aufgebaut. Da dies nur im Hauptpeicher stattfindet sollte das auch schnell gehen.
Programmierhans : Da die Routine mit allen Datenbanken funktionieren soll wollte ich die Verwendung von mehreren Datasets und DataAdapters verhindern. Es können über 100 Tabellen gleichzeitig sein die da angesprochen werden.
Grüße Bernd
Hallo Leute,
zuerst einmal finde ich dieses Forum echt Klasse. Ich habe aus den Beiträgen schon viele Ideen schöpfen können.
Nun komme ich nicht weiter, und weder im Forum noch anderswo kann ich eine Lösung dazu finden.
Ich lade aus einer externen Datei mehrere Datensätze, die in verschiedene Tabellen gespeichert werden müssen. Da ich vorher nicht weiss welche Tabelle füge ich mehrere Tabellen dem Dataset hinzu und erzeuge eine Tabellenzeile zu der jeweiligen Tabelle :
conn = new SqlConnection(connStr);
ds = new DataSet();
da = new SqlDataAdapter( sqlstr, conn);
cb = new SqlCommandBuilder(da);
DataRow rw = null;
try
{
conn.Open();
ds.Clear();
da.SelectCommand.CommandText = "SELECT * FROM table1";
ds.Tables.Add("table1");
count = da.Fill(ds,"table1");
da.SelectCommand.CommandText = "SELECT * FROM table2";
//cb.RefreshSchema();
ds.Tables.Add("table2");
count = da.Fill(ds, "table2");
da.SelectCommand.CommandText = "SELECT * FROM table3";
ds.Tables.Add("table3");
count = da.Fill(ds, "table3");
}
catch (Exception ex)
{
}
conn.Close();
while (...)
{
// Datensatzanfang, dat = Name der Tabelle
rw = ds.Tables[dat].NewRow();
// Felder zuordnen
rw[fname1] = str1;
rw[fname2] = str2;
// Datensatz einfügen
ds.Tables[dat].Rows.Add(rw);
try
{
conn.Open();
count = da.Update(ds, dat);
}
catch (Exception ex)
{
MessageBox.Show("Datenbank-Fehler : " + ex.Message);
}
}
Beim Ausführen des da-Update-Befehls bekomme ich die Fehlermeldung DataColumn 'dat3_spalte1' in der DataTable 'table1' für SourceColumn 'dat3_spalte1' ist nicht vorhanden"
Ich habe inzwischen festgestellt, dass es am ComandBuilder liegt, der seien Insert-Befehl nur für eine Tabelle erstellt hat.
Auch Probieren mit cb.RefreshSchema() und Anlegen von mehreren Comandbuildern hat keinen Erfolg gebracht.
An welcher Stelle muss ich denn eigentlich den Commandbuilder erstellen ?
Wie kann ich Commandbuilder für mehrere Tabellen erstellen ? Erkennt er dann welchen Insert-Befehl er benutzen muss ?
Danke für eure Bemühungen,
Grüße Bernd
Restzeit anzeigen :
Aus der bisher übertragen Datenmenge und der bisher verbrauchten Zeit den Zeitbedarf errechnen. Das ist einfacher Dreisatz. Das Ergebnis wird dann zum Ende hin immer genauer.
(wie im WindowsDialog)
Bist Du sicher ? In Windows stimmen die Zeitangaben nie !
😉
Grüße Bernd
Das finde ich gut !
Ich habe mich schon gewundert das ein Forum über C# und Dot.Net auf PHP läuft.
Ich habe auf einer meiner Seiten PHP laufen und bin froh wenn ich es durch Dot.Net ablösen kann.
Viel Erfolg mit dem neuen Forum
Bernd
Trial and Error :
Hab nun die DLL-Dateien in ein Verzeichnis \bin kopiert, das ich leer auf meinem Webserver gefunden habe.
Nun geht alles. Hoffe ich.
Aber ASP.NET aus PHP kann ich immer noch nicht ohne iframe aufrufen.
Grüße Bernd
Ich habe nun entdeckt, dass bei der Konvertierung von 1.1 nach 2.0 sich die Verzeichnisstruktur ändert und so alte und neue Programmversionen auf dem Webserver zu finden sind. Hab nun alles gelöscht und neu übertragen.
Jetzt kommen dauernd neue Fehlermeldungen.
😦
Gibt es da eine Patentlösung oder soll ich Version 1.1 wieder installieren ?
Grüße Bernd
PS.: Die aktuelle Fehlermeldung kann jeder aufrufen unter http://partyfotos.quasarshop.de/Bewerbung.aspx?bew=partygirl
vbprogger : Ist ja meine eigene Scriptdatei, also kann ich auch include verwenden.
Hab jetzt alles auf Dot.NET 2.0 umgestellt, jetzt laufen meine Programme nicht mehr.
Ich bekommen die Fehlermeldung :
The type 'Eventkalender.Global' is ambiguous: it could come from assembly 'D:\ftp\partyfotos\bin\Eventkalender.DLL' or from assembly 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\2656e183\8a72f965\App_Code.szenihbf.DLL'. Please specify the assembly explicitly in the type name.
Was kann ich da tun ?
Originalfehlermeldung : http://partyfotos.quasarshop.de/Bewerbung.aspx?bew=partygirl
Achja, die Unterschiede zwischen 1.1 und 2.0 kenne ich. Nur nicht die speziellen Unterschiede bei "<form action=...>".
Zwei von meinen Portalen (siehe Signatur) laufen ja schon unter DotNetNuke 4.0.2, also unter ASP.NET 2.0.
Grüße Bernd
Wie geht das mit fopen ?
Welche Vorteile bringt das ?
Die Datei, die ich mit include aufrufe, wird ja von Dot.Net interpretiert. Was kann fopen mehr ?
Die Dateien sind mit Dot.Net 1.1 erstellt, ich kann sie aber auf 2.0 umstellen.
Was geht dann besser ?
Grüße Bernd
Hi Leute,
danke für eure Ideen.
iframe klappt bestens, mit den bekannten Nachteilen dass man die Formulatgröße fest angegen muss usw. :
http://www.partyfotos.de/modules.php?name=html_Test
Der andere Vorschlag klappt leider nicht :
Ich habe die Angabe
<form id="Form1" method="post" action="http://partyfotos.quasarshop.de/Test2.aspx" runat="server">
in die Datei Test2.aspx geschrieben. Beim Klick auf den Button wird dennoch http://www.partyfotos.de/Test2.aspx aufgerufen.
Wenn man sich den Quelltext ansieht erkennt man, das der Eintrag "Action" verschwunden ist. Dot.Net scheint den zu entfernen.
Quelltext :
<form name="Form1" method="post" action="Test2.aspx" id="Form1">
Grüße Bernd
Hallo erstmal,
bin neu hier und habe gleich ein kompliziertes Problem / Anforderung :
Ich betreibe ein Portal basierend auf PHPNuke (leider), das ich so auf die Schnelle nicht umstellen kann.
Einzelne Module habe ich schon in ASP.NET 2.0 programmiert.
Nun würde ich gerne ASP.NET-Module im PHP integrieren, so dass z.B. Eingabemasken im Portal erscheinen.
Beispiel für den PHP-Code :
include("header.php");
include("http://partyfotos.quasarshop.de/Test.aspx");
include("footer.php");
header.php und footer.php erzeugen das ganze Portal mit Titel und Menü usw.
In Test.aspx soll nun eine Eingabemaske sein.
PHP und ASP.NET liegen z.Zt. auf verschiedenen Rechnern.
Formular einzeln : http://partyfotos.quasarshop.de/Test.aspx
Formular im Portal integriert : http://www.partyfotos.de/modules.php?name=html_Test
Wenn ich nun ein Control wie z.B. Button klicke, dann ruft sich das Formular wieder auf, aber nicht wie gewünscht das Portal, sondern das Formular selbst.
Wie kann ich nun angeben, dass er statt /Test.aspx z.B. http://www.partyfotos.de/modules.php?name=html_Test aufruft ?
Parameter die modules.php übergeben bekommt wie Session-ID kann ich an Test.aspx weitergeben.
Grüße Bernd