Warum nicht mit der ZipLib ein Archiv erstellen, welches beim Ausführen des Setups entpackt wird? Oder ist als Deployment nur eine einzige Datei vorgesehen? In dem Fall kannst du dir auch mal den Nullsoft-Installer anschauen.
Visual Studio LightSwitch ist doch genau dafür gedacht, oder habe ich da was falsch verstanden? Habe es mir noch nicht im Detail angeschaut und kann leider zum Aufwand nicht viel sagen, aber ich dachte, es wäre genau in diese Richtung gegangen.
Dasselbe Problem habe ich auch mit einer SQLServerCE-Datenbank, die im selben Verzeichnis liegt, wie die eigentliche Assembly. Nur mit Adminrechten läuft das Programm fehlerfrei. Ein Manifest ist ja mit zwei Klicks eingebettet und dann wird ja nur noch der AuthenticationLevel (oder wie es auch heißt) geändert. 2 Minuten Arbeit. Allerdings finde ich den Klick bei der UAC auch unzumutbar und ich überlege mir gerade eine Lösung mit verschieben der DB in das Userverzeichnis, wo sie allerdings für alle anderen Nutzer des Rechners auch erreichbar sein muss.
Ist vermutlich auch kein besonderer Aufwand, aber wenn man zu Hause zu nichts kommt, stellt es doch eine Hürde dar
Ich bin kein Fan davon, meine Daten anderen Anbietern einfach so zur Verfügung zu stellen. Da auch unter meinen Bookmarks diverse private Dinge zu finden sind, die maximal den engeren Familienkreis was angehen, kommt ein derartiger Dienst für mich so nicht in Frage. Ich habe mir daher einen kleinen Webservice gebastelt, der auf meinem Heimserver läuft und bei entsprechender Eingabe auch eine entsprechende Ausgabe (die Bookmarks) liefert. Derzeit ist es noch etwas Gefrickel, aber evtl. werde ich mir noch ein Firefox-Plugin schreiben, das mir das dann abnimmt. Je nachdem, wie viel Zeit ich dafür finde (momentan siehts schlecht aus).
Wollte mich gestern auch via Dreamspark registrieren und mein Telefon freischalten lassen. Allerdings war meine Schule nicht aufgeführt... blöde Sache, dachte ich. Also, Mailfunktion genutzt und dem Support erläutert, warum ich mich nicht registrieren kann. Der (äusserst vorbildliche) Support hat mir dann ganz unkompliziert einen Key zugeschickt, mit dem ich mich registrieren kann zusammen mit einem Link für den Schuladmin, der darüber die Schule registrieren soll. Heute gleich mal ausprobiert, Handy freischalten ging problemlos (Omnia 7) und die erste Popel-Ausprobier-App ist auch schon draufgespielt, alles schön einfach. So muss das sein!
Also ja, als Student kann man sich bei dem Dreamspark-Programm anmelden (falls Schule nicht in Liste, einfach eine kurze freundliche Mail schreiben) und dann ebenfalls kostenlos beim App Hub anmelden. Wie das Gerät dann freigeschalten wird, ist dort auch erklärt.
Ich selbst habe hier das "Windows Presentation Foundation 4. Einführung und Praxis" von Norbert Eder liegen. Zwar mit knapp 400 Seiten eines der dünneren Bücher, aber trotzdem sehr empfehlenswert, gerade wenn man schon viel mit WinForms gearbeitet hat. Vor allem, was ich sehr schön finde, ist nicht erst noch ein 400-seitiger Einführungskurs in C# dabei, sondern das wird als bekannt vorausgesetzt.
danke für die Ideen. Ich habe es jetzt mit dem kleinen Tray-Tool gemacht und das funktioniert soweit ganz gut, wenngleich es natürlich schon etwas abgefahren ist, so ein Tool für diesen Zweck überhaupt zu haben :D
ist zwar nichts absolut essentiell wichtiges, aber es ist trotzdem mit der Zeit recht nervig. Wenn ich Ressourcen hinzufügen möchte (bereits existierende Icons z.B.), dann mache ich das über die Projekteigenschaften und den Punkt "Ressourcen". Dort wird per Menüeintrag auch die Möglichkeit angeboten, allerdings bin ich, in dem sich öffnenden FileOpen-Dialog immer im Verzeichnis "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE"
Da mein Ordner Program Files sehr umfangreich ist und auch der Rechner selbst über knapp 20 Laufwerke verfügt, ist es in dem aufgeklappten Ordnerbaum extrem nervig, immer wieder hoch und runter zu scrollen, um irgendwann das richtige Laufwerk mit meinen Icons zu finden. Gibt es irgendeine Möglichkeit, dieses Standardverzeichnis z.B. auf D:\ zu setzen, anstatt diese riesen Verzeichnisangabe?
Für mich war es relativ schnell absehbar, dass ich kein Studium würde machen können. Zum einen, weil es für mich schlichtweg nicht finanzierbar war, zum anderen weil ich während dem Abitur leider schon festgestellt habe, dass durchgängiges Lernen mit keinem oder nur geringem Praxisbezug für mich eine Hürde darstellt, die ich nur mit unverhältnismäßig hohem Aufwand würde meistern können. Ich hatte mich daher zu einer Ausbildung zum IT-Systemelektroniker entschieden und mache inzwischen eine zweite Ausbildung zum Fachinformatiker-Anwendungsentwicklung, da hier der Praxisbezug doch etwas mehr gegeben ist.
Klar, auch bei einem Studium wäre hier und da Praxis angesagt. Sei es durch Praxissemester oder durch eigenständiges Arbeiten nebenher. Allerdings gerade der teilweise übertriebene Mathematikanteil hat mich dann trotzdem abgeschreckt (nicht, dass es überhaupt groß zur Diskussion stand, da es eh nicht finanzierbar gewesen wäre).
Wie schon erwähnt wurde, bietet einem ein Studium wohl hauptsächlich dadurch einen Vorteil, dass man Probleme auch aus anderen Blickwinkeln erfassen und lösen kann (an dieser Stelle mal noch unabhängig davon, ob es auch bessere Lösungen sind). Dadurch, dass einem ein breit gefächertes Themenspektrum mitgegeben wird, ob man will oder nicht, ergibt sich das automatisch. Allerdings sehe ich nicht, dass ein FIAE dadurch ebenso automatisch zum "dümmeren Programmierknecht" wird. Ganz im Gegenteil. Hier in der Firma ist der FIAE eher die wertvolle Ergänzung zu den studierten Kräften, die zwar allerlei theoretische Ansätze haben, aber bei der praktischen Umsetzung meist nicht allzu schnell Erfolge verbuchen können. Dafür geben sie den FIAE öfters mal ganz nützliche Lösungsansätze mit, auf diese die nicht von allein, oder nur mit sehr viel Zeit und Arbeit, gekommen wären.
Ein Studium ist, von meiner Seite abschließend formuliert, immer nützlich und auch sinnvoll, aber nicht zwangsweise notwenig. Alternativen wären gerade eine Ausbildung zum FIAE mit enormer Eigeninitiative, was persönliche Fortbildung angeht. Aber ich denke, ohne diese enorme Eigeninitiative ist weder ein Studium noch eine vernünftige Berufsausbildung wirklich sinnvoll oder machbar. So kann man nicht allgemeingültig feststellen, ob ein Studium immer der "richtige" und bessere Weg ist, da es doch vom Einzelnen abhängt. Manche können ein Studium gar nicht in Erwägung ziehen (ich), andere zieht die breite Theoriebasis geradezu magisch an. Wie gesagt, es ist von Fall zu Fall verschieden und allgemein nicht formulierbar.
Kann das Problem nicht nachvollziehen. Bei mir ist das alles recht zügig sichtbar. Hast du vielleicht viele Drucker installiert von denen ein Teil Netzwerkdrucker oder aber gar nicht erreichbare Drucker sind?
Für solche Dinge hatte ich mir einen kleinen Updater geschrieben, der sich holt, was er gerade braucht. Allerdings habe ich für die möglichen Versionssprünge jeweils eigene Update-Pakete gemacht. Sprich, ich habe ein Paket für die User von z.B. v1.03 gemacht, ein anderes für v1.04 und wieder ein anderes für 1.04b. Der Updater hat seine Version geprüft und auf dem Webserver jeweils das für ihn passende Paket abgeholt. Auf dem Server selbst sind dann natürlich Redundanzen vorhanden, allerdings juckt das nicht wirklich, wenn sie richtig organisiert sind. Jedenfalls musste wenigstens der Client nicht für ein Update 1-3x ein beinahe-komplett-Update herunterladen.
Hab hier auf der Arbeit leider nur einen XP Rechner, daher kein Snippingtool und auch keine UAC etc.
Allerdings mit regedt32.exe habe ich hier keinerlei Probleme. Evtl. mal unter den Projekteinstellungen -> Sicherheit -> Voll vertrauenswürdige Anwendung nachschauen?
Da es ansonsten unter XP geht, vermute ich aber ein Sicherheitsfeature von Win7... gemäß dem Fall, die Exe liegt wirklich da.
Sehr viel interessanter wäre es, so ein Office 365 auf einem eigenen Server zu betreiben und die "Cloud" damit ebenfalls selbst zu betreiben. Gerade bei Firmen sollte es eine solche Option geben, da es ansonsten einfach nicht zu verantworten ist, interne Dokumente mal eben auf Servern in USA zu hosten, wo sie beliebig für CIA und Co. zugänglich sind.
Eine eigene Serverapplikation, die jeder für sich selbst betreiben kann, wäre da wesentlich attraktiver. Aber leider nur für den Kunden, nicht für MS.
Ohne wahnsinnig viel Ahnung davon zu haben, wie man so etwas möglichst gut und performant macht, würde ich hier mit einer for-Schleife die Dataset.Rows[zeile][spalte] durchlaufen und beim entsprechenden Value den Zähler der Schleife dazu heranziehen, um die Zeile des DataGridViews anzuspringen und einzufärben oder anderweitig zu formatieren.
Also in etwa so:
for (int i=0; i<dataset.rows.count; i++)
{
if (dataset.rows[i][SpalteID] == wert)
{
formatiereGridRow(dataGridView.rows[i][SpalteID]);
}
}
Dazu natürlich noch entsprechend die methode "formatiereGridRow(DataGridRow row)" implementieren oder die Formatierung direkt in der Spalte vornehmen.
Vorab einige Infos, wie das erstellte Zeugs aussieht, und was es tun soll:
Es existiert ein sehr großes Programm, welches in C++ geschrieben wurde und seine Funktion erfüllt. Bisher zumindest. Jetzt sollte eine Funktion des Programms massiv überarbeitet und erweitert werden, was meine Aufgabe wurde. Diese Funktion greift auf eine Access-Datenbank zu, holt sich dort meist ein paar tausend Datensätze ab und gibt diese in entsprechender Form als xml aus. Das Ganze funktioniert für sich allein wunderbar - getestet habe ich alles als .exe, allerdings soll daraus eine .dll werden, welche im großen Programm (unmanaged) genutzt und aufgerufen wird. Das Aufrufen funktioniert soweit auch, allerdings fliegt er mir mitten in der .NET-Assembly beim füllen der Tables im DataSet mit einem Stackoverflow raus. Warum, das weiss ich nicht. Abfangen von StackoverflowException funktioniert leider nicht - er läuft in den try-Block und fliegt dann dort mit Stackoverflow weg. Ich hoffe, dass mir hier jemand helfen kann bzw. jemand eine Idee hat, woran das liegen könnte. Wie gesagt, für sich allein läuft die Assembly fehlerfrei und macht genau das, was sie soll (auch mit großen Datenmengen -> xml-Exporte mit teilweise 35-40 MB)
verwendetes Datenbanksystem: Access 97
Umgesetzt habe ich das Holen der Datensätze in C# wie folgt:
namespace AdasExport
{
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
public class AbExport()
{
public void writeData(int iAnbieter, int iStufe, int iDatumStart, int iDatumEnde)
{
private DataSet dataSet = new DataSet();
private OleDbConnection oledbConnection = new OleDbConnection();
private OleDbCommand oledbSelectCommand = new OleDbCommand();
private OleDbDataAdapter oledbDataAdapter = new OleDbDataAdapter();
oledbConnection.ConnectionString = @"Data Source = TmpAbda.mdb;" + "Provider = Microsoft.Jet.OLEDB.4.0;";
dataSet.Tables.Add() //wird 8 mal ausgeführt, da ich 8 Tables benötige
try
{
label.Text = "Datenbanken werden gelesen...";
label.Refresh();
proBar.Value = 0;
int iSchrittweite = 142;
fillDiversTable();
proBar.Value += iSchrittweite;
fillLagerTable(); ----> hier fliegt er raus
proBar.Value += iSchrittweite;
fillLieferungTable();
proBar.Value += iSchrittweite;
fillGrosshaendlerTable();
proBar.Value += iSchrittweite;
}
}
//Hier sind natürlich noch viele weitere Funktionen, diese werden zu dem Zeitpunkt aber noch gar nicht angesprungen.
Die Funktion, in der er mir den Stackoverflow erzeugt, sieht so aus:
private void fillLagerTable()
{
oledbSelectCommand = oledbConnection.CreateCommand();
oledbSelectCommand.CommandText = @"SELECT Lager.diPzn, Lager.iLagNr, Lager.diSpezVk FROM Lager;";
oledbDataAdapter.SelectCommand = oledbSelectCommand;
try
{
oledbDataAdapter.Fill(dataSet.Tables[3]);
}
catch (Exception ex)
{
writeFehlerlog(ex);
}
oledbSelectCommand = oledbConnection.CreateCommand();
oledbSelectCommand.CommandText = @"SELECT LagerOrt.iLagNr, LagerOrt.strBezeich FROM LagerOrt ORDER BY iLagNr;";
oledbDataAdapter.SelectCommand = oledbSelectCommand;
try
{
oledbDataAdapter.Fill(dataSet.Tables[4]); // An dieser Stelle tritt der Stackoverflow auf
}
catch (Exception ex)
{
writeFehlerlog(ex);
}
}
Offenbar führt er also einige Fill-Befehle aus und anscheinend geht ihm da irgendwann der Platz aus. Kommentiere ich den Aufruf der Funktion aus, dann fliegt er mir bei der nächsten raus mit derselben Meldung.
In den Projektoptionen habe ich den Haken bei "Für COM-Interop registrieren" gesetzt, was ja benötigt wird, um die Assembly überhaupt aus unmanaged Code aufzurufen. Hier wird mir dann eine .tlb erstellt, welche ich, zusammen mit der .dll, ins Verzeichnis meiner unmanaged Anwendung kopiere.
writeData_2 wird die public-Funktion in C++ genannt, die in C# writeData mit 4 Aufrufparametern heißt. Von dieser existiert noch eine mit 3 Parametern, deshalb wird sie in C++ als Nr. 2 aufgeführt.
Wie gesagt, sobald er in die Assembly springt, werden dort sogar ein paar .Fill-Anweisungen ausgeführt, aber ab einer bestimmten Menge scheint das nicht mehr zu wollen. Erklären kann ich es mir nicht so recht, da das Ding standalone ja funktioniert.
Hm, die Welt könnte so einfach sein, wenn es nicht so Pappnasen wie mich gäbe, die die einfachsten Dinge nicht erkennen -_-
Danke für den Hinweis. Bin dem Ganzen nochmal nachgegangen, nachdem ich meinen Code als funktionierend angesehen hatte. Natürlich war es die falsche DB... ich hatte eine DB im Projektverzeichnis und in jener Kopie der DB im Debugverzeichnis ist alles schön eingetragen wie es sein soll. Ebenso wie es in VS dann angezeigt wird, nachdem ich die Referenz korrigiert hatte. Sorry für die vergeudete Zeit und nochmal danke für den Hinweis, der mich jetzt wirklich weitergebracht hat ;)
Die Uhrzeit bei meiner DB im Projektverzeichnis wird wohl nachgesetzt, weil zu dem Zeitpunkt des Zugriffs wohl eine Select-Anweisung abgesetzt und gespeichert wird.
verwendetes Datenbanksystem: SQL Server 2005 Express Edition
Hallo zusammen,
als ich mich letztes Wochenende mal wieder etwas an mein Projekt setzen und dort ein paar kleinere SQL-Statements absetzen wollte, bin ich auf ein etwas merkwürdiges Problem gestoßen. Ich schiebe es momentan auf meine Unfähigkeit oder dass ich irgendwas vergessen habe, aber eines nach dem anderen.
In meinem C#-Quellcode gebe ich einen INSERT-Befehl auf mit ein paar Einträgen. Das funktioniert auch wunderbar und mit .NonExecuteQuery() wird das Ding auch abgesetzt und auf meiner GUI erscheint meine Datenbankanzeige um den neuen Eintrag ergänzt. Die "zuletzt geändert"-Eigenschaft der Datenbankdatei zeigt mir auch an, dass soeben wohl was gemacht wurde.
Will ich mir nun aber im Visual Studio 2010 (Professional) den Inhalt der eben erweiterten Tabelle anschauen, dann sehe ich lediglich diejenigen Einträge, die vor meinem Insert schon vorhanden waren. Sobald ich mir die Tabelle anzeigen lasse, wird auch der "zuletzt geändert"-Wert meiner Datenbankdatei geändert, also meine Einträge wohl rückgängig gemacht. So weit, so schlecht.
Woran könnte das liegen und was kann ich dagegen unternehmen (außer fluchen)? Ich denke, dass es irgendwas mit nicht abgeschlossenen Transaktionen zu tun hat (von meiner Seite), die durch den Select-Befehl, den VS2010 beim Anzeigen wohl absetzt, rückgängig gemacht werden. Aber ich finde leider kaum was im Netz zu einem solchen Problem und wie man es lösen könnte.
5 Minuten länger Nachdenken hätten den Thread gespart. Habe jetzt einfach eine weitere Methode ShowDialog(Bitmap bild, usw.) eingebaut. Funktioniert bisher ganz gut, allerdings heisst das nicht, dass ich für weitere Tips nicht dankbar wäre... man kann schließlich nie genug lernen :D
ich würde gerne selbstgebaute Dialoge (einfach ein entsprechend designtes Form-Objekt) mit Parametern aufrufen, welche den Dialog entsprechend anders aussehen lassen. Das Aufrufen selbst ist mittels der Show()-Methode ja einfach zu handhaben, allerdings beinhaltet der Dialog auch diverse Buttons und eine Picturebox, die durch Parameter im Show-Aufruf angepasst werden sollen (je nachdem, was eben benötigt wird). Vermutlich sehe ich grade den Wald vor lauter Bäumen nicht, aber wie kann ich dieses Problem lösen?
Danke schonmal für eure Zeit, die ihr für das Lesen schon genommen habt.
Edit: Fertige Lösungen sind zwar an und für sich schön, allerdings bevorzuge ich einen kleinen Schubs auf die richtigen Themen, durch die ich mich dann wühlen und die Lösung selbst erarbeiten kann ;)
derzeit wird in meinem Programm ein DataSet aus einer Access-Datenbank befüllt. Dazu gibt der Benutzer einen Suchbegriff ein und im GridView wird ihm dann eine Auswahlmöglichkeit angezeigt. Diese Ergebnisse liegen im DataSet, welches an das GridView angebunden ist. Nun möchte ich hier zwei weitere Spalten bei den Auswahlmöglichkeiten anzeigen, deren Inhalt in Abhängigkeit der Spalteninhalte der Daten des DataSets ermittelt wird. Allerdings weiss ich nicht so recht, wie ich das machen soll. Versucht habe ich bisher, eine Column im DataSet.Table anzufügen (Add), allerdings weiss ich nicht, wie ich dieser dann Inhalte geben soll.
Zwar ist eine Trennung von Daten und anzeige immer sinnvoll, allerdings gehören diese beiden Spalten, die angezeigt werden sollen, ebenfalls ausschließlich zur Anzeige für den Benutzer, die Sachen werden also danach nicht mehr weiter benötigt.
Hat mir jemand ein paar Tips und Anregungen, wie ich dieses Problem lösen könnte?
Ich habe im Dataset ein neues Table und darin die erforderlichen Spalten erstellt. Anschließend konnte ich die Daten der ausgewählten Zeile Zelle für Zelle übernehmen und schön so anordnen, wie es gefordert war.
Durch die Bindung des DGV an das Dataset wird auch alles wunderbar dargestellt
Bei mir wird bei Alt+Tab statt meiner Anwendung dann der Dialog angezeigt, wenn dieser geöffnet ist. Aber ich dachte, das wäre so gewünscht, dass der Dialog die Anwendung quasi komplett solange blockiert, bis er geschlossen wird?
Weil auch wenn ich ShowInTaskbar auf true setze, sehe ich bei Alt+Tab nur den Dialog, meine Anwendung aber nicht, trotz zweier Anzeigen in der Taskleiste.
Hallo nochmal und danke für die schnelle Antwort ;)
Mir fällt jedoch grade auf, dass ich mein Programm wohl doch bescheiden beschrieben hatte. Sorry dafür... ich gelobe Besserung.
Mein Form1 beinhaltet kein DataGrid, sondern lediglich ein Eingabefeld in welches der Nutzer seinen Suchbegriff eingibt (hier die Kommunikation durch Events, sorry für die blöde Formulierung oben). Durch einen Druck auf die Entertaste wird das zweite Form geöffnet, auf welchem beide DataGrids liegen. Im DGV1 sucht er dann seinen Begriff und holt ihn mit nochmaligem Druck auf Enter in das DGV2. Durch Druck auf Shift wird das Form2 wieder ausgeblendet und es kann ein neuer Suchbegriff eingegeben werden usw. Ich weiss, hört sich seltsam an, aber ist vom Kunden so gewollt, obwohl ich das ganze ergonomisch zumindest für fragwürdig halte.
Im Prinzip soll also auf demselben Form von DGV1 eine gewählte Zeile in das DGV2 übernommen werden. DGV1 hat als DataSource ein Dataset, welches von einem DataAdapter befüllt wird. Bietet es sich hier an, die gewählte Zeile in ein zweites Dataset zu schreiben und das DGV2 an dieses zu binden? Gibts hierzu ein paar Schlüsselworte nach denen ich suchen und mich informieren sollte, damit ich hier vorwärts komme?
mein erster Post in dieser Community und gleich eine blöde Frage...
Ich habe 2 DataGridViews einem Form (Edit: geändert, da falsch geschrieben, es handelt sich nicht um 2 DGVs auf 2 versch. Forms, sorry). Die Kommunikation zwischen diesen wurde mit Eventhandlern gelöst. Das erste DGV dient dazu, Suchergebnisse in einer Access-Datenbank darzustellen. Das funktioniert soweit auch sehr schön. Nun soll ein bestimmtes (vom Nutzer wählbares) Suchergebnis (=Zeile im DGV) in ein anderes DGV kopiert werden, sozusagen als Sammlung aller Ergebnisse, die der Nutzer haben möchte.
Leider komme ich hier überhaupt nicht weiter. Mit Rows.Add(DGV1.Rows.SelectedRows) erhalte ich auf dem zweiten DGV stets nur eine leere Zeile.
Ich möchte eigentlich nicht unbedingt die fertige Patentlösung... aber ich wäre um ein paar Schubser in die richtige Richtung sehr dankbar ;)