Hallo, wir haben einen eigenen Server bei Webjanssen. Wir sind soweit recht zufrieden, bei Problemen ist der Support immer sehr hilfreich und engagiert.
Zu Preisen kann ich jetzt nicht so viel sagen, da wird halt nen Server haben mit mehreren Domains weiß ich jetzt nicht was eine Domain kostet, müßte man halt nachschauen.
ciao Anke
weiter unten steht:
To install the .NET Framework with a Setup project
und
To install MDAC with a Setup project
Hier gibt es den Boostrapper: http://www.microsoft.com/downloads/details.aspx?FamilyID=627921a0-d9e7-43d6-a293-72f9c370bd19&DisplayLang=de
Hier noch etwas deutsches:
Soweit ich verstanden habe, kann man mit dem Bootstrapper auch andere Setups einbinden wie z.B. MDAC. Dazu gibt es ja auch eine Anleitung bei Microsoft.
Ich denke svenson hat Recht. Wenn Windows versucht deine Applikation zu beenden, dann wird sichlich auch das OnClosing-Event geworfen und da du ja verhinderst das das Programm beendet wird, kann auch Windows nicht herunterfahren...
ciao Anke
Such mal bei Microsoft nach Boostrapper
Da kannst du prüfen ob ein Programm z.B. Direct X oder so auf dem PC installiert ist und wenn dies nicht der Fall ist wird es automatisch installiert... Dazu muss man dann die setup.exe starten, nicht sie setup.msi sonst klappt das nicht...
Hatte so ein Problem letzte Woche selber 😉 ich wollte halt automatisch die Installation zum Frameworl starten wenn dies nicht installiert ist und danach meine Software installieren...
Du könntest entweder das Bild in der PictureBox ein paar Pixel kleiner machen als die eigentliche PictureBox und zentriert setzen und dabei halt eine BackColor angeben (Achtung, das Bild muss dann immer gleich groß sein!)
oder du erstellst dir z.B. ein UserControl in das du eine PictureBox legst, die halt ein parr Pixel kleiner ist als das Control. Als Eigenschaft gibst du dann die BackColor der Usercontrols, das Image-Attribut der PictureBox und was du halt noch so brauchst 😉
Ich hoffe das war jetzt eingermaßen verständlich...
ciao Anke
Ich wäre auch dafür, und myCSHARP.de soll ruhig auch was abbekommen. Uns es darf ruhig auch "Girlie-Shirts" geben 😁
Ich habe da: http://de.personello.com/ für meine Cousine ein T-Shirt zu Weihnachten machen lassen und es ist echt super geworden 😉
Vie´lleicht gibt es ja Rabatt wenn man mehrere nimmt 😉
@Altstetter: Liest du wirklich Readme-Dateien bevor du etwas installierst??? Ich lese die ja nicht mal hinterher 🤔
Ich habe schon überlegt ob man die MSI-Datei nicht einfach verstecken kann, so das der Anwender die im Normalfall gar nicht sieht. Ich befürchte nämlich nur das der Anwender einfach auf Setup klickt und nocht auf die Endung der Datei schaut...
natürlich kann ich einen Autostart einbauen, aber manchmal bricht man den auch ab und startet direkt von er CD (wer weiß schon was der User so denkt)
ciao Anke
Danke für deine Hilfe SimonKnight6600. Mal sehen was ich mache, es ist erst mal nicht ganz so dringend, weil die Setup-Datei erstmal nur für Testzwecke generiert wird.
Doof finde ich auch, das man nicht eine Meldung bekommt a la "Um XYZ installieren zu können, benötigen Siedas .NET Framework, nöchten Sie das jetzt installieren?
Der User muß sich doch wundern warum das Framework installiert wird, wenn er doch mein Programm XYZ installieren will!
ciao Anke
Hallo Forum,
Ich muss eine Installationsroutine erstellen und will dabei prüfen ob das .NET Framework bereits installiert ist.
Ich habe nun herausgefunden das ich dazu den Bootstrapper verwenden kann. Ich habe dazu auch etwas im Forum gefunden aber so richtig kapieren tu ich das ganze Prozedere noch nicht...
Ich habe den Bootstrapper installiert und für mein Projekt eingerichtet. Wenn ich nun die Setup.exe starte prüft er ob das .NET Framework installiert ist, ist dies nicht der Fall, wird dieses installiert. Danach wird auch das Sprachpaket installiert (wenn der User das möchte).
Zu guter letzt folgt dann die Installation meines eigentlichen Programms.
nun mein Problem:
Was ist wenn der Anwender die setup.msi-Datei startet? Dann prüft er zwar auch ob das .NET Framework installiert ist und ich habe es sogar hinbekommen das er es installiert falls es nicht da ist, aber danach installiert er mir mein eigentliches Programm nicht!
Der Anwender muß also noch einmal die Datei setup.msi starten und das kann ja nicht ganz der Sinn sein...
Hat jemand eine Lösung für mein Problem? Wäre echt super 😉 da ich trotz googeln und Co noch nicht wirklich eine Lösung gefunden habe.
ciao Anke
Springt er denn überhaupt in deine Methode? Und wenn ja, lass dir doch mal den KeyCode ausgeben...
Da du ja schon von Lutz Roeder den .NET Reflector nutzt, solltest du dir auch mal "CommandBar for .NET" anschauen (http://www.aisto.com/roeder/dotnet/)
In der ZIP-Datei die du dort runterladen kannst, gibt es eine Datei namens HelloWorld.cs, die eine Klasse Images besitzt, diese sieht wie folgt aus (Code ist von "CommandBar for .NET")
private class Images
{
private static Image[] images = null;
// ImageList.Images[int index] does not preserve alpha channel.
static Images()
{
// TODO alpha channel PNG loader is not working on .NET Service RC1
Bitmap bitmap = new Bitmap("ImageList16.png");
int count = (int) (bitmap.Width / bitmap.Height);
images = new Image[count];
Rectangle rectangle = new Rectangle(0, 0, bitmap.Height, bitmap.Height);
for (int i = 0; i < count; i++)
{
images[i] = bitmap.Clone(rectangle, bitmap.PixelFormat);
rectangle.X += bitmap.Height;
}
}
public static Image New { get { return images[0]; } }
public static Image Open { get { return images[1]; } }
public static Image Save { get { return images[2]; } }
public static Image Cut { get { return images[3]; } }
public static Image Copy { get { return images[4]; } }
public static Image Paste { get { return images[5]; } }
public static Image Delete { get { return images[6]; } }
public static Image Properties { get { return images[7]; } }
public static Image Undo { get { return images[8]; } }
public static Image Redo { get { return images[9]; } }
public static Image Preview { get { return images[10]; } }
public static Image Print { get { return images[11]; } }
public static Image Search { get { return images[12]; } }
public static Image ReSearch { get { return images[13]; } }
public static Image Help { get { return images[14]; } }
public static Image ZoomIn { get { return images[15]; } }
public static Image ZoomOut { get { return images[16]; } }
public static Image Back { get { return images[17]; } }
public static Image Forward { get { return images[18]; } }
public static Image Favorites { get { return images[19]; } }
public static Image AddToFavorites { get { return images[20]; } }
public static Image Stop { get { return images[21]; } }
public static Image Refresh { get { return images[22]; } }
public static Image Home { get { return images[23]; } }
public static Image Edit { get { return images[24]; } }
public static Image Tools { get { return images[25]; } }
public static Image Tiles { get { return images[26]; } }
public static Image Icons { get { return images[27]; } }
public static Image List { get { return images[28]; } }
public static Image Details { get { return images[29]; } }
public static Image Pane { get { return images[30]; } }
public static Image Culture { get { return images[31]; } }
public static Image Languages { get { return images[32]; } }
public static Image History { get { return images[33]; } }
public static Image Mail { get { return images[34]; } }
public static Image Parent { get { return images[35]; } }
public static Image FolderProperties { get { return images[36]; } }
}
Im Grunde genommen, schneidet diese Klasse, also lediglich die einzelnen "Icons" aus...
Ich hoffe das ich dir helfen konnte,
ciao Anke
Du kannst den Zeileninhalt Splitten, verwende dazu einfach die Split-Methode (String). Näheres findest du in der Doku 😉
ciao Anke
Das geht mit Server.HtmlEncode(string) oder so in der Art. Mußt du mal nach suchen, aber so in etwa ist der Befehle 😉
ciao Anke
enum Key
{
/// <summary>
/// Der Key1 hat den Wert 0.
/// </summary>
Key1 = 0,
/// <summary>
/// Der Key2 hat den Wert 1.
/// </summary>
Key2 = 1
}
Als Parameter übergibst du dann auch den Enum, also z.B.
Key key = Key.Key1;
SetKey(Key k)
{
this.key = k;
}
Wenn du überprüfen willst, welcher Key übergeben wurde, kannst du dies folgendermaßen tun:
SetKey(Key k)
{
if(k == Key.Key2)
{
// mach hier irgendwas...
}
}
ciao Anke
hast du die ListView so eingestellt, das immer mehere Einträge nebeneinander stehen können (ähnlich wie im Windows-Explorer) und halt unter jedem Icon ein Text steht?
Du könntest die ListView auch so einstellen, das jeweis nur ein EIntrag pro Zeile ist, dann hast du jeweils links das Bild und rechts den Text, dann wären die Einträge immer gleich hoch, egal wie lang der Text ist...
ciao Anke
Du weiß doch der ListView eine ImageList zu und in der ImageList kannst du doch die Bildgröße festlgegen, oder nicht?
Du musst halt im Coe (nicht im Designer) Textboxen erstellen und sie dem Control hinzufügen...
Dabei musst du die Location halt jeweils um die Höhe der eben erstellten TextBox + Rand verschieben 😉
Also bei Mapinfo bekommst du auch deusche Karten 😉
Man könnte es beispielsweise auch so schreiben (ungetestet):
DataRowView drv = (DataRowView)bs.Current;
int BelegID = Convert.ToInt32(drv["BelegID"]);
Ist das verständlicher für dich
dann hab ich wohl nicht alles richtig gelesen...
Soll also so sein wie in Excel... (z.B.)
Hmm, ja das ist etwas schwieriger... da weiß ich so spontan auch nichts... das ist ja auch schwierig weil die Breite ja je nach Text unterschiedlich groß ist...
Vielleicht habe ich dich ja falsch verstanden, aber warum machst du das nicht einfach folgendermaßen ???
private void tabControl1_SelectedIndexChanged(object sender, System.EventArgs e)
{
(((TabControl)sender).SelectedTab).Text = "123";
}
Genau das gleich hatte ich auch letztens, echt blöd das ganze...
hiermit umgesht du das:
System.Text.Encoding.GetEncoding("ISO-8859-1")
Dazu mußt du Encoding verwenden 😉
public StreamReader(string, Encoding);
Initialisiert eine neue Instanz der StreamReader-Klasse für den angegebenen Stream mit der angegebenen Zeichencodierung und der Option für die Erkennung der Markierung für die Bytereihenfolge.
Mach es doch einfach mal so:
du liest einfach deine Daten aus und schreibst diese nacheinander in die Textbox.
also so:
// Schleife (foreach oder so, mit denen du deine Daten durchläufst).
foreach(string file in ...)
{
this.tbx.Append(file + Environment.NewLine);
}
Das sollte dann so funktionieren...
ciao Anke
Das geht ganz einfach 😉
/// <summary>
/// Tritt ein, wenn auf einen Spaltenkopf der ListView geklickt wird.
/// Es wird die jeweilige Spalte sortiert, auf die geklickt wurde.
/// </summary>
/// <param name="sender">System value</param>
/// <param name="e">System value</param>
private void listViewStrategies_ColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e)
{
// überprüft ob diese Spalte bereits sortiert ist
if ( this.lvColumnSorter.CurrentColumn == e.Column)
{
// wenn ja, wird überprüft ob diese Spalte Aufsteigend sortiert ist
if ( this.lvColumnSorter.Sort == SortOrder.Ascending)
{
// wenn ja, wird die Spalte nun absteigend sortiert
this.lvColumnSorter.Sort = SortOrder.Descending;
}
else
{
// wenn nicht, wird die nun aufsteigend sortiert
this.lvColumnSorter.Sort = SortOrder.Ascending;
}
}
// als zu sortierende Spalte wird die angeklickte vermerkt
this.lvColumnSorter.CurrentColumn = e.Column;
// es wird sortiert...
this.lvwStrategies.Sort();
}
Dabei ist lvColumnSorter eine Instanz meine ColumnSorters und lvwStrategies ist die entsprechende ListView 😉
ciao Anke
P.S. Ich habe da noch einen kleinen Tipp. Wenn du deine ListView akualiseren willst, bzw. wenn du mehrere Daten einfügen willst, dann entferne erst den ColumnSorter von der ListView - für dann die Daten ein und binde den ColumnSorter erneut an die ListView... er sortiert sond nämlich direkt beim einfügen und das dauert sehr lange!
Deswegen sollst du ja die "alten" Dateien in eine extra Archivtabelle legen und nicht alles in eine Tabelle machen...
Ansonsten könntest du zunächst einen Group By machen. Dann durchläufst du die Datensätze der ermittelten Dateien (Daten) und generierst einen SQL-Befehl der nach der jeweiligen Datei sucht.
Also für Dein Beispiel:
a.txt
a.txt
b.html
c.doc
a.txt
b.html
a.txt
erhälst du beim Group By:
a.txt
b.html
c.doc
Für dieses generierst du halt jeweils einen Befehl der nur den Datensatz mit dem höchten Datum zurück gibt...
Wenn du viele Daten in der DB hast, kann das jedoch ganz schön viel Zeit beanspruchen...
Hast du die Dateien, die du kopieren willst vielleicht geöffnet, bzw. könnten sie durch irgendwein Programm blockiert sein?
Du könntest dir auch selber einen "Autowert" erzeugen und beim Insert mit angeben.
Dazu ermlittelst du die höchste ID die es in der Datenbank gibt und addierst eins. Existiert noch keine ID nimmst du halt einfach die 1 ...
Wenn du die ID dann in dem Insert-Befehl mit übergibst trägt er sie einfach in die DB ein (trotz Autowert).
Das ist vielleicht besser, als hinterher anhand der Werte die ID zu ermitteln, oder?
Es gibt da noch die Möglichkeit mittels @Identity, aber da traten bei mir auch öfter Probleme auf...
Ich würde vielleicht eher eine Tabelle mit den aktuellen Dateien anlegen und eine Archivtabelle. In der Archivtabelle kannst du halt die ursprüngliche Version mit dem jeweiligen Datum speichern und in der Tabelle mit den aktuellen Daten kommt jeweils die neuste Version rein, da solltest du dann auch noch das Datum dazu speichern.
Beispiel:
Folgende Daten stehen in deiner Tabelle mit den aktuellen Daten.
Tabelle aktuell
ID - Datei - Datum
1 - a.txt - 17.10.2005 16:00:00
2 - b.txt - 16.10.2005 13:30:00
Wenn du nun beispielsweise die Datei b.txt änderst, die ja die ID 2 hat dann trägst du das was in der "Tabelle aktuell" drin steht ins Archiv, also
Tabelle Archiv
ID - Datei - Datum
2 - b.txt - 16.10.2005 13:30:00
Und die neue geänderte Datei trägst du halt in die Tabelle aktuell, die dann wie folgt aussieht:
Tabelle aktuell
ID - Datei - Datum
1 - a.txt - 17.10.2005 16:00:00
2 - b.txt - 18.10.2005 08:23:00
Das wäre dann wesentlich übersichtlicher denke ich.
In der Archivtabelle dürfte natürlich die ID kein Primärschlüssel sein, da die ID ja doppelt vorkommt, wenn die Datei mehrere Versionen besitzt. Aber das könnte man ja realisieren 😉
Hallo Maddinel,
Hmm, ich sehe da jetzt nicht so das Problem. Vielleicht habe ich dich ja auch falsch verstanden, aber warum liest du nicht die Texte aus der XML-Datei aus und füllst dann die Label mit den entsprechenden Texten:
this.lbl1.Text = text1;
this.lbl2.Text = text2;
Also so in der Art... wahrscheinlich hast du ja auch unterschiedlich viele Obst bzw. Gemüsesorten, also sollten die Label ja eventuell dynamisch erzeugt werden, oder du solltest halt ein entsprechendes Control zur Anzeige der Daten nehmen...
ciao Anke
Du könntest es auch folgendermaßen machen:
MyDS.Tables["Nachname"].Columns.Add("Name");
foreach(DataRow row in MyDS.Tables["Nachname"].Rows)
{
row["Name"] = row["Nachname"] + ", " + row["Vorname"];
}
comboBox2.DataSource = MyDS.Tables["Nachname"];
comboBox2.DisplayMember = "Name";
Nur so als Idee...
ciao Anke
Hallo rockthecity,
könnte es vielleicht sein, das auf dem 2000er PC kein Framework installiert ist?
ciao Anke
Hallo Powerslave
Probier es mal mit IsPostBack in der Forumsuche 😉
Wieso willst du denn ein select-Element, du kannst doch eine DropDownList bequem mit Daten aus einer Datenbank füllen: siehe Ado.Net
Soweit ich weiß ist ein Group By auf eine DataTable nicht so ohne weiteres möglich, das müßtest du dir schon selber schreiben 😉
VoID: Ich glaube so habe ich es damals aus gelöst 😉
Ist bei mir wie gesagt schon eine halbe Ewigkeit her, wahrscheinlich schon 2 jahre...
Habe auch seit über einem Jahr keine Webanwendung gemacht.
Ich habe wohl bei diesem Control runat=server hinzugefügt und dann damit gearbeitet...
Hmm, als ich glaube ich habe sowas mal gemacht. Bei mir konnte der User bei sich lokal ein Bild aussuchen und hochladen, das war gar nicht weiter schwer. Ich habe den Code aber leider nicht mehr X(
Das geht mit nem HtmlControl aber ich weiß nicht mehr genau wie, bzw. wie das heißt... ich glaube irgendwas mit file... ist schon ne Weile her, seit ich meine letzte Webanwendug gemacht habe 😉
Setzte in deiner Form einfach MinimizeBox bzw. MaximizeBox auf false, wenn die Schaltflächen gar nicht dargestellt werden soll...
ciao Anke
Du musst schon noch abfangen, ob an der aktuellen Stelle ein Item existiert. Das ganze müßte ungefähr so aussehen...
C#-Code:
private void listView_Outward_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
Point p = new Point(e.X, e.Y);
Control c = listView_Outward.GetChildAtPoint(p);
if(c != null)
{
Help.ShowPopup(c, c.Tag.ToString(), p);
}
}
ciao Anke
wie wäre es mit ReadOnly = true 😉
Du kannst mit GetChildAtPoint(Point p) an das gewünschte Control kommen...
Ich hätte auch eine Idee wie du einen "ToolTip" anzeigen könntest. Ich habe mich gerade mit dem Thema Hilfe beschäftigt und da könnte dir folgendes helfen:
(GetChildAtPoint(Point p) -> damit ermittelst du dir das ListViewItem
Help.ShowPopup(this, "dies ist die Hilfe für dein ListViewItem", new Point(p)); -> damit zeigst du deine Hilfe (sozusagen ToolTip) an.
Ich weiß nur nicht mehr wie lange diese Hilfe angezeigt wurde... musst du halt mal probieren 😉
Habe mal ein wenig geggogelt:
http://www.hot-maps.de/vertrieb.html
das hier sieht nicht schlecht aus:
Also wenn du nur Karten vor einem bestimmten Umkreis willst, dann sollte es vielleicht nicht allzu teuer werden... zumindest wenn du die Karte einfach nur als Bild einbindest, wenn das programatisch werden soll, dann kostet das natürlich ne ganze Menge...
Musst du direkt in ein bestehenes (offenes) Dokument schreiben, oder musst du z.B. eine XLS-Datei erzeugen?
Oh Sorry, dann habe ich das wohl verwechselt... in einem anderen Thread war glaube ich noch ne Frage, wie man die Form unsichtbar macht (glaub ich 🤔 )
Fügst du den Text des Labels im Designer hinzu, also so wie du in deinem Codeschnipsel gemacht hast?
Änderst du vielleicht die Text-Align-Eigenchaft später noch einmal.
Fall du den Inhalt des Labels an anderer Stelle nochmal setzt (aus ner DB oder so) dann könnte es auch sein das du ein Leerzeichen hinter einem Text hast... dann könntest du ein Trim() auf diesen Text anwenden bevor die ihn einfügst...
Du kannst mir auch gerne mal die Form als Mail schicken, Adresse hast du ja 😉
ciao Anke
Ich auch...
Zeig dir doch mal den Rand der Lables an, vielleicht täuscht dich ja auch nur dein Auge 😉