Laden...
S
Siedlerchr myCSharp.de - Member
Fachinformatiker Anwendungsentwicklung NRW Dabei seit 07.11.2009 178 Beiträge
Benutzerbeschreibung

Forenbeiträge von Siedlerchr Ingesamt 178 Beiträge

08.08.2010 - 22:42 Uhr

Nur kann ich so nicht mehr auf öffentliche Methoden der abgeleiteten Klasse C zugreifen die nicht in der Klasse S sind. Das halte ich jetzt aus objektorientierter Sicht für noch schlechter. Wäre aber für meine jetzige Aufgabe eine Lösung, da ich z.B. in C nichts public habe.

Grundsätzlich sollte bei Vererbung die Unterklasse nur eine Spezialisierung oder Einschränkung der Basisklasse, nie eine Erweiterung der Funktionalität darstellen.
Siehe auch Liskovsches Substitutionsprinzip

Also im Grund genommen die Ersetzbarkeit der Objekte innerhalb der Vererbung.

08.08.2010 - 22:04 Uhr

Ich schicke dir mal mein aktuelles Projekt per PN, da ich es hier nicht öffentlich an den Post hängen mächte.

08.08.2010 - 19:09 Uhr

Kurz der Ablauf der Funktionen:
Also ich Wähle in der combobox über den Textfeldern den Hoster aus, dadrunter AccType gebe User und PW ein und klicke auf Hinzufügen.

Also der Dreh und Angelpunkt ist die Stelle beim hinzufügen:

ds.AddAccountRow(....)

Als letzten Parameter erwartet die eine HosterRow, das Problem ist aber nur, ich kann ja nur eine hinzufügen, daher hatte ich einfach mal nach der ersten Combobox gefiltert.
Aber man soll ja in der anderen Combobox das ganze ändern können.

Wie ist es dann überhaupt möglich das ganze zu füllen, ich meine das muss doch irgendwie gehen!?

Also was mir Kopfzerbrechen bereitet ist, wie ich dem Account sagen kann, dass ich die Account.Hoster_ID gleich Hoster.ID seien soll die ich grade in der Combobox auswähle.....

Sollte das nicht gehen ist es auch nicht so schlimm.

Was mich aber irritiert, der Hoster wird mir erst angezeigt in der ComboBox wenn ich draufklicke.
Ich hab grad schonmal mit den Styles rumgespielt, aber ich krieg den gwünschten Effekt, also das es direkt angezeigt wird wie auch im Tut nicht hin.

08.08.2010 - 15:41 Uhr

Das AcceptChanges war wohl noch von vorhin drin, wollte es nach deiner ausführlichen guten Erklärung dann rausnehmen.
Es macht aber keinen Unterschied obs drin ist oder nicht 😉

08.08.2010 - 15:37 Uhr

Also am Besten ist es wenn man Freunde oder Bekannte fragt, oft kennt jemand einen der etwas macht.
Das Neudesign und Coding einer Webseite meines Vaters hat ein Kollege aus meiner Klasse in der Berufsschule übernommen. Er arbeitet auch in einer Firma die Webdesign machen, so ist das halt zustande gekommen.

08.08.2010 - 15:25 Uhr

Also erstmal Danke für den Tipp mit dem Validate, das hat mich schonmal etwas weitegebracht.

Und das speichern passiert im Button übernehmen, habe den Namen noch nicht geändert.

Dort mach folgendes:

       this.Validate();
            DataGridView_Setting.EndEdit();
        
            
     
            Console.WriteLine("Update Dataset ");

            foreach(DataRow  dr in ds.Account)
            {
                Console.WriteLine("DataTable Acc :Hoster_ID = {0}, Username = {1}, Pwd = {2}, Active {3}  ", dr["Hoster_ID"],dr["User"], dr["Password"], dr["Active"]);
            }

Und auch wenn ich jetzt die Combobox ändere auf den 2. Eintrag sollte ja eigentlich dort auch Hoster_ID 2 ausgegeben werden, wird es aber nicht.
Es immer die ID mit der ich den Account das erstemal über die Schaltfläche "Hinzufügen" belegt habe.
Es passiert immernoch kein Update der Hoster_ID.

Und der ValueMember der Combobox ist weiterhin "Hoster.ID"

Übrigens ist das hier der Code vom Hinzufügen:


   EnumerableRowCollection rowIDColl = from hoster in ds.Hoster where hoster.Name == account.Hoster select hoster.ID;
                FileHosterAssignDataset.HosterRow hosterRow = null; ;
                foreach(int id in rowIDColl )
                {
                    hosterRow = ds.Hoster.FindByID(id);
                }
                
                   
                ds.Account.AddAccountRow(account.Type, account.TypeName, account.Username, account.Password, false, hosterRow);
                Console.WriteLine("Account.hoster = {0}, Username = {1}, Pwd = {2}, Type = {3} , TypeName = {4} ", account.Hoster, account.Username, account.Password,account, account.Type, account.TypeName);
                Console.Write("AccountTable Count {0} ", ds.Account.Count);

Ich lass es mir dort ja nach dem Speichern ausgeben, ich meine der BOOL Wert der Zelle Active wird mir ja ausgeben, also wenn ich die Checkbox im DGv anklicke und dann auf Übernehmen Drücke, dann bekomm ich in o.g. Ausgabe auch "True".

Mir ist jetzt rätselhaft warum die Hoster_ID nicht geupdatet wird?

08.08.2010 - 14:28 Uhr

Wieso nennst du deinen 2. Button nicht einfach um, also änderst einfach das Name Attribut dann hast du das Problem doch nicht?

08.08.2010 - 14:20 Uhr

Also, in der MSDN Doku stand folgendes:

DataSet.AcceptChanges-Methode

Führt einen Commit für alle Änderungen aus, die an diesem DataSet seit dem letzten Ladevorgang oder seit dem letzten Aufruf von AcceptChanges vorgenommen wurden.

Also ich hab mir auch nochmal die Tuts angeschaut, aber nichts gefunden was mich weiterbringt.

Also mein Problem ist eigentlich folgendes, wie kann ich der Spalte Hoster_ID in der Tabelle Account sagen das sie den Inhalt ändern muss wenn ich in der Combobox den Hoster auswähle?
Ich habe nur das Dataset und ich habe keine DB und auch keine TableAdapter.

Also ich hab auch schon probiert, die ValueMember und DisplayMember der Combobox anzupassen, so :


   DataGridViewComboBoxColumn col = new DataGridViewComboBoxColumn();
            col.DataSource = ds;
            col.ValueMember = "Account.Hoster_ID";
            col.DisplayMember = "Hoster.Name";

Das erschien mir logisch, aber es funktioniert nicht, ich krieg eine Argument Exception, das nicht an den neuen Wertmember gebunden werden kann.

Ich suche eine Möglichkeit die Spalte Hoster_ID in der aktiven AccountRow zu updaten wenn ich da von der Combobox was auswähle.
Das muss doch irgendwie gehen.

07.08.2010 - 19:07 Uhr

Joa, es funktioniert jetzt. Danke für den Tipp. Die Video Tuts sind dementsprechend auch gut.

Jetzt hab ich mir überlegt, da ich ja idealerweise schon die Combobox habe wäre es ja auch cool wenn ich jetzt da den Hoster ändere, dass die Sachen dann auch übernommen werden.

Also ich hab hier meine ComboBoxColumn die ich dem DGV hinzufüge:

 
//ds = Dataset mit den Tabellen Hoster, Account  sieh auch meine vorherigen Post.

 DataGridViewComboBoxColumn col = new DataGridViewComboBoxColumn();
            col.DataSource = ds;
            col.ValueMember = "Hoster.ID";
            col.DisplayMember = "Hoster.Name";

Die Datasource des DGV ist mein Dataset, DataMember diie Tabelle Account.
So jetzt kann ich wunderbar einen Datensatz in die DataTable Account einfügen und er wird angezeigt.

Jetzt hab ich noch nen Extra Button speichern gemacht, der soll meine Änderungen die ich im DGv mache speichern.Dazu hab ich das hier gefunden:

 ds.AcceptChanges(); //Übernimmt die Änderungen

Das Problem ist, ich kann da ja wunderbar den Hoster auswählen in dem DGV und auch ändern, aber die Änderungen werden nicht übernommen, das heißt in der Account Tabelle bleibt die Hoster_Id immer gleich.
Interessanterweise wird aber der geänderte BOOL Wert der CheckBox Active gespeichert, beim klick auf meinen Speichern Button.

Also ich lass mir das gnaze dann noch ausgeben um zu wissen ob es klappt:
Ausgabe ist folgendes:


DataTable Acc :Hoster_ID = 1, Username = test, Pwd = test, Active True  //Hoster ID sollte jetzt eigentlich 2 sein. 

Hiermal ein Screenshost zur Verdeutlichung.

Wie krieg ich das jetzt hin das die Tabelle Account das mitkriegt das sich der Hoster ändert?
Ich hab da schon rumprobiert aber nix gefunden wsa funktioniert.

Gruß
Siedlerchr

06.08.2010 - 15:33 Uhr

Hallo,

ich hab mal ne Frage zu nem DataGridView, ich möchte dort gerne Spalten aus 2 Tabellen anzeigen lassen.
Also ich hab ein DGV, als DataSource einem DataTable Account der mit einem weiteren DataTable Hoster verbunden ist bzw in Relation steht.

Aufbau der Tabellen:
Account:
(ID, Typ, TypName, Hoster_ID)

Hoster
(ID, Name, Adresse)

Die DataRelation besteht über die ID.
So jetzt zeigt mir mein DGV wunderbar den Inhalt der Tabelle Account an, aber ich würde anstatt des Feldes Hoster_ID gerne das Feld Hoster_Name anezgein lassen.
Ich hab schon diverse Sachen ausprobiert und rumgesucht, aber ich habs nicht gefunden was mich weiterbringt.

Also in einer DB hätte ich ja jetzt einfach nen join an die Tabelle gemacht und das wärs 😃

Gibt es eine Möglichkeit das so anzuzeigen? Also das der mir halt in Abhängigkeit der ID den Namen anzeigt, von mir aus auch zusätzlich?

Gruß
Siedlerchr

31.07.2010 - 18:39 Uhr

Zum Thema Objektdatenbanken gibt es auf Heise developer einen kostenlosen Podcast zu dem Thema und auch Links zu verschiedenen DB-Systemen:

Heise Developer - NoSQL-DB-Podcast

Ich hab leider noch nicht die Zeit gefunden mir den anzuhören, könntest dann aj evtl Feedback geben.

31.07.2010 - 18:36 Uhr

Es gibt diverse Möglichkeiten keine Db zu benutzen, du kannst z.B. alles als XMl Dateien speichern oder du erstellst dir ein Dataset welches du nutzt und in der du alle Tabellen verwaltest.

30.07.2010 - 16:56 Uhr

Wie ist gewährleistet, dasses von überall zugreifbar ist? ist class BusinessLogic ein Singleton?

Also wenn ich das richtig verstehe, dann musst du in der factory Method nur ein Objekt der entsprechende Klasse erzeugen in dem du es haben willst und dem Constructor das

IBusinessLogic dataset

übergeben.
Und dann kannst du in der Klasse per

dataset.returnDataset()

drauf zugreifen.

So, ich habe da aber noch eine Frage:

Ich habe jetzt das Beispiel hier unten in dem ich meine Main_Form erzeuge und ihr das Dataset übergebe. Allerdings übergebe ich der ja in dem Moment schon den konkreten Typ.
Oder ist es besser ich erzeuge die Main_Form mit in der Factory Methode und übergebe ihr das IBusinesslogic dataset und greife in der Form-Klasse dann das eigentliche FileHosterAssignmentDataset über die Methode

dataset.returnDataset()

?

Also eigentlich kommt es doch aufs gleiche raus, nur das ich in dem ersten Fall direkt schon den konkreten Typ übergebe.

 public void CreateFormMain()
        {
            FileHosterAssignDataset ds = this.dataset.returnDataset();
            Console.WriteLine(ds.DataSetName); //Komplettes Dataset im Zugriff
            Application.Run(new frm_Main(ds)); 
           
        }

24.07.2010 - 20:04 Uhr

So ich habe mich mal über das Thema informiert und ein gutes Tutorial gefunden:
Inversion Of Control Beginners Guide

Auf Basis dieses Tutorials habe ich das umgsetzt.
Ich poste hier mal meine Lösung, wenn jemand ähnliches Umsetzen will.


interface IBusinessLogic
    {

        FileHosterAssignDataset returnDataset();

    }

Das ist meine Main_Klasse von der ich das ganze verteile

class BusinessLogic
    {
        IBusinessLogic dataset = null; 
        FormCreator fc;
        public void factoryMethod()
        {

           this.dataset = new Dataset(); //Warum kann ich hier nicht auf die Methoden  des Objekts 
           this.fc = new FormCreator(this.dataset);

        }

        public void ReturnDataset()
        { 
          Console.WriteLine("Dataset {0}", fc.ReturnDataset().returnDatset()); //Hier  //kann ich letendlich auf mein Dataset zugreifen, das heißt ich kann es sogar von //meiner factoryMethod auf das FileHosterAssignDataset zugreifen.


        }


Hier meine Klasse Dataset :


 //Hier das Dataset erstellen
        private FileHosterAssignDataset ds;

         public Dataset()
         {
             this.ds = new FileHosterAssignDataset();
         }


        public FileHosterAssignDataset returnDataset()
        {

            return this.ds;
        }

Und hier die Klasse FormCreator in der ich dann die Main_Form aufrufen werde:

class FormCreator
    {
        IBusinessLogic dataset;
        public FormCreator(IBusinessLogic dataset)
        {
            this.dataset = dataset;
        }


        public IBusinessLogic ReturnDataset()
        {
            return this.dataset;
        }


21.07.2010 - 22:06 Uhr

Ich habe vor ein Dataset als eine Art Datenbankersatz zu verwenden, weil ich in meinem Fall keine DB brauche, das wäre unnötig und nicht das was ich brauche.

Also ich habe mir mit dem VS-Designer ein schönes Dataset zusammengebaut und erzeuge in einer Klasse in Objekt davon und befülle das ganze.

So, jetzt will ich von anderen Klassen auch auf das Dataset zugreifen mit den Daten die schon drin sind, geht aber leider nicht weil ich ja jeweils ein neues objekt kriege.

Eine Möglichkeit ist ja das ich in jeder Klasse mir ein eigenes Dataset erstelle und das ganze hin und her kopiere.

Die andere Möglichkeit ist ich speicher es als Xml zwischen und lade es jweils wenn ich es wieder befüllen will.

Was mir grad noch eingefallen ist, ich mache eine static Klasse mit einem static Dataset und kann dann über den Umweg da immer drauf zugreifen.

Aber ich finde die Lösungen nicht das gelbe vom Ei, gibt es denn noch weitere bessere Möglichkeiten das zu realisieren?

21.07.2010 - 20:44 Uhr

Danke für die Antworten, das mit dem Today werde ich dann mal umsetzen

Das mit DateTime.Now.Date hatte ich schon probiert das hatte nicht das gewünschte Ergebnis gebracht.

21.07.2010 - 16:22 Uhr

Hallo, ich bin auf etwas gestoßen was ich nicht so Recht verstehe. Es ist Teil einer Passwortüberprüfung, also wann das PW abläuft, in diesem Fall soll ein Hinweis kommen wenn es in exakt 14 Tagen abläuft.
Das interessante ist aber, dass wenn es in 14 Tagen abläuft, C# mir aber angibt es wären 13 Tage.

Also hier mal ein Teil des Codes:
der 04.08.2010 ist heute in 14 Tagen ( wenn man auf einen Kalender schaut 😃 )

DateTime datePwdExpire = new DateTime(2010,8,4);  
            int daysToExpire;
            TimeSpan ts = datePwdExpire.Subtract(DateTime.Now);
            daysToExpire = ts.Days; //Ergibt 13 Tage sind aber 14
            Console.WriteLine(daysToExpire);

Aber in der Ausgabe kommt 13-Tage raus.
Ich versteh nicht so ganz warum der auf 13 kommt, kann mir das mal einer erklären?

11.07.2010 - 16:19 Uhr

Ja also ich habe halt bereits einen DataTable mit Daten und eine List<string> in der Daten sind, ich will die jetzt an das Dataset übergeben, also das Dataset mit den Werten füllen bzw die DataTables.

Ich habe versucht über die Methode Clone des DataTables die Daten in den DataTable vom Dataset zu kpoieren, aber da Problem ist ich krieg die Fehlermeldung, dass ich nur ReadOnly auf den DataTable vom Dataset zugreifen kann.

Das einzige was ich bisher als Möglichkeit sehe ist das ich mit einer Schleife zeilenweise durch den Table und die List gehe und dann die Daten per Rows.Add in den DataTable vom Dataset zu speichern.

Ich find die Lösung nicht grad optimal und wollt halt wissen ob es noch ne Alternative gibt.

11.07.2010 - 14:47 Uhr

Hallo ich hab mir ein Dataset mit 2 Realation erstellt siehe Screenshot.

Ich such jetzt eine komfortable Möglichkeit das Dataset zu befüllen:
Also ich habe auf der einen Seite bereits einen vorhanden DataTable mit den Infos für die Tabelle file und auf der anderen Seite hab ich eine List<string> mit den Daten für die Hoster.

Meine Frage ist jetzt wie ich das Dataset bzw die DataTables füllen kann, ohne dass ich da für jeden Datensatz in einer Schleife durchlaufen muss.

Kann man das mit Linq irgendwie machen? Hat da jemand vielleicht nen Ansatz oder nen anderen tipp?

05.07.2010 - 14:52 Uhr

Als CSV reader kann ich dir den hier von codeproject empfehlen:

http://www.codeproject.com/KB/database/CsvReader.aspx

02.07.2010 - 15:13 Uhr

Habe was interessantes gefunden:

Programming With Exchange Server 2007 (EWS) - Part 1
http://www.codeproject.com/KB/exchange/Exchange2007EWS-Part1.aspx

Das ganze funktioniert über Exchange Web Services, also so ne art SOAP gedöns.

Edit// Ich hab deinen Post nicht richtig gelesen, also hier sind paar Tipps für dne Zugriff auf Outlook kansnte vielleicht auch gebrauchen.

:rtfm: http://support.microsoft.com/kb/310258/de

http://geekswithblogs.net/timh/archive/2006/05/26/79720.aspx

Und hier was zum senden:

http://www.thorstenvogt.eu/node/11

Ansonsten schau mal in die Dokumentation von :
Microsoft.Office.Interop.Outlook

Da wirst du sicherlich noch etwas finden.

Edit// Hab hier eine grafische Übersicht über das Outllok Objekt gefunden:
http://msdn.microsoft.com/en-us/library/Aa275401

01.07.2010 - 17:26 Uhr

Hm, ja das sollte eigentlich reichen, ich probiers gleich mal aus....

Scheint zu klappen: Danke für den Tipp!

PS: Du hast das Content bei deinem Code vergessen und ich habs jetzt mal eben korrigiert:

   string inputpath = @"C:\TMP\test.txt";
            string outputpath = @"C:\TMP\udtf8.txt";
            string content = File.ReadAllText(inputpath, Encoding.Default);
            File.WriteAllText(outputpath,content, Encoding.UTF8);
       




01.07.2010 - 15:51 Uhr

Hallo,

ich lasse per Excel-VBA-Makro eine TXT-Datei erstellen, das Problem ist, ich kann dem nicht sagen das das Format der Datei, nicht der Inhalt UTF8 sein soll.

Die einzige Möglichkeit die ich bis jetzt gefunden habe ist, die Datei mit Notepad zu öffnen und bei Speichern Unter die Codierung auf UTF8 stellen.

Am besten wäre eine automatische Möglichkeit, irgendein Makro oder meintwegen ein Linux Shell Script.

Die Lösung kann auf Linux oder Windows basieren, das ist egal.

Hat jemand eine Idee wie man sowas machen kann oder gibt es sowas schon?

01.07.2010 - 15:34 Uhr

Es wäre hilfreich, wenn du mal einmal deine Query hier posten würdest, damit man das mal versuchen nachvollziehen kann.

01.07.2010 - 15:14 Uhr

Ich vermute mal das du mit PGM die GUI meinst die dann nach einer Zeit einfriert.

Du solltest die DB Geschichte(Daten auslesen) in einen eigenen Thread auslagern und per Control.Invoke dann die GUI aktualisieren.

Denn so läuft die komplette DB Geschichte (Daten auslesen) in dem GUI Thread:

Schau dir mal diesen Beitrag hier in der FAQ an: FAQ: Warum blockiert mein GUI?

Zitat aus dem Beitrag:

Diese Effekte treten immer dann auf, wenn langlaufende Aktionen (Aktionen, die länger als 1/10s laufen oder laufen können) im GUI-Thread ausgeführt werden.

Das wird bei dir auch der Grund sein, warum es sich nicht regt.

Warum jetzt das bei dir im Debug Modus geht, kann ich dir nicht sagen, aber wenn du das in einen separaten Thread auslagerst, sollte das "Hängen" nicht mehr passieren.

15.06.2010 - 15:20 Uhr

Also ichweiß zwar nicht was du damit vor hast, aber Mozilla
Thunderbird (OpenSource) kann IMAP und POP und du kannst dort ja genau wie bei Firefox erweiterungen schreiben.

http://www.mozillamessaging.com/de/

14.06.2010 - 15:43 Uhr

Danke erstmal.

Fallen euch noch Klassen oder Interfaces in C# ein die Indexer nutzen?

Also ich weiß von IList und IDictionary, dass sie einen Indexer deklariert haben.

14.06.2010 - 10:31 Uhr

Ich habe hier einen Code Schnipsel gefunden der zeigt wie man das machen kann:

/// <summary>
/// Changes the XML encoding.
/// </summary>
/// <param name="xmlDoc">The XmlDocument.</param>
/// <param name="newEncoding">The new encoding.</param>
/// <returns></returns>
private XmlDocument ChangeXmlEncoding(XmlDocument xmlDoc, string newEncoding)
{
    if (xmlDoc.FirstChild.NodeType == XmlNodeType.XmlDeclaration)
    {
        XmlDeclaration xmlDeclaration = (XmlDeclaration)xmlDoc.FirstChild;
        xmlDeclaration.Encoding = newEncoding;
    }
    return xmlDoc;
}

NewEncoding solltest du dann z.B. auf utf-8 setzen

http://dotnet-snippets.de/dns/c-xml-encoding-eines-xmldocument-aendern-SID862.aspx

14.06.2010 - 10:27 Uhr

Hallo,

ich informiere mich grade über das Thema Indexer und suche mal ein Beispiel aus der Praxis. Mich würde nämlich interessieren an welchen Stellen man das praktischerweise einsetzen kann und wo es wirklich Sinn macht es zu verwenden.

Wäre super wenn da jemand was hat oder zeigen kann.

Gruß
Siedlerchr

08.06.2010 - 13:46 Uhr

Danke für den Hinweis, der hat mir als Gedankenanstoß geholfen:

Ich adde schon dem ersten DataTable der die Grundlage des DGV ist eine Spalte "Kontakt_ID" hinzu.
Mir ist dann klar geworden, dass ich es damit relativ einfach umsetzen kann...


DataRow selectedContactRow 
string key

selectedContactRow["Kontakt_ID"] = key;
Kontakt_auswahl.ImportRow(selectedContactRow);


Wenn das wirklich so ist, dann hast du womöglich einen Grundsatz von .NET nicht verstanden: Trenne Daten und Anzeige!

So hab ich das auch eigentlich gestaltet, das eionzige was das so ein bisschen durcheinander bringt ist die Sache, dass ich nicht anders an die SelectedRows drankomme bzw die gescheit weiterverarbeiten kann als über den Umweg in DataRow

08.06.2010 - 10:39 Uhr

Also ich habe keine Möglichkeit gefunden das anders umzusetzen:

Das Problem ist folgendes: Ich habe eine DataGridViewSelectedRowCollection die ich mit foreach Schleifen auslese und dem DataTable adde:

 foreach (DataGridViewRow selectedContacts in selectedRows)
           {
               string KontaktID = DB.GetTableKey("Kontakt");
               Console.WriteLine(KontaktID);
            
               DataRowView drv = (DataRowView)selectedContacts.DataBoundItem;
              
               FillContact(drv.Row, KontaktID);

Und FillContact:


  private void FillContact(DataRow selectedContactRow, string key )
         {
   Console.WriteLine(key);
                testlist = selectedContactRow.ItemArray.ToList();
                testlist.Add(key);

                Console.WriteLine("Spalten {0} ", Kontakt_auswahl.Columns.Count);

             Kontakt_auswahl.Rows.Add(testlist.ToArray());

}

Eine andere Möglichkeit die ich erst gesehen habe war diese:


 DataRow dr = selectedContactRow;
             Kontakt_auswahl.ImportRow(selectedContactRow);
      
            dr["Kontakt_ID"] = key;

Nur hierbei ist das Problem das in der Collection keine Spalte ID vorhanden ist, denn die stammt ursprünglich aus einem DataGridView.

07.06.2010 - 12:58 Uhr

Ich habe eine DataRow und einen DatTable.

Bevor ich die DataRow dem DataTable hinzufüge, will ich noch Werte für die Spalte ID ergänzen.

Ich habs jetzt so gelöst:

  

DataRow selectedContactRow
DataTable Kontakt_auswahl


string key = DB.GetTableKey("Kontakt");
                 Console.WriteLine(key);
                testlist = selectedContactRow.ItemArray.ToList();
                testlist.Add(key);

                Console.WriteLine("Spalten {0} ", Kontakt_auswahl.Columns.Count);
             
             Kontakt_auswahl.Rows.Add(testlist.ToArray());

Das funktioniert so auch, nur ich bin am überlegen ob das nicht vielleicht einfacher geht.
Gibt es da ne bessere Lösung als erst inne Liste zu kopieren und dann wieder in ein Array umzuwandeln?

Wäre super, wenn da jemand nen Tipp hat...

Gruß
Siedlerchr

07.06.2010 - 12:19 Uhr

Danke nochmal für den Hinweis, habs jetzt hinbekommen:

Es gibt beim DataTable die Methode ImportRow( DataRow), mit der konnte ich die Rows dann dem neuen DT hinzufügen.

Das Thema hat sich hiermit erledigt.

04.06.2010 - 16:42 Uhr

Für den neuen DataTable hab ich mir den des DGV geklont, damit ich das Schema habe:

DataTable  dgvkontaktTable = (DataTable) KontaktDataGrid.DataSource;
             DataTable Kontakt = dgvkontaktTable.Clone();

Danke für den Tipp mit den DataBoundItems , das hat mich schon weitergebracht.

So desweitern hab ich das dann so umgesetzt:


DataGridViewSelectedRowCollection selectedRows; //Die aus dem DataGrid

foreach (DataGridViewRow selectedContacts in selectedRows)
           {
              
               FillContact(selectedContacts);
               //
               foreach(string krolle in kRollenIDList) 
               {
                   DataRowView drv = (DataRowView) selectedContacts.DataBoundItem; 
                    

               
                   Kontakt_auswahl.Rows.Add(drv.Row);

               }
}

Das einzige Problem was ich jetzt habe ist das ich beim Add() des DataTables folgende Exception kriege:

ArgumentException
Diese Zeile gehört bereits zu einer anderen Tabelle.

Das sacht mir gar nichts, was ist denn daran falsch?

04.06.2010 - 15:52 Uhr

Du kannst es dir einfach machen und diesen Fast CSV Reader hier benutzen:
http://www.codeproject.com/KB/database/CsvReader.aspx

Das Ding ist total schnell und du kriegst die Daten auch als DataSource zurück.
Benutze den auch bei mir in meinem Programm. Einfacher geht's echt nicht.

04.06.2010 - 15:35 Uhr

Hallo,

ich bin auf der Suche nach einer Möglichkeit die ausgewählten Zellen eines DatagridViews wieder in einen DataTable zu speichern.

Also das DGV hat als DataSource bereits einen DataTable und ich möchte quasi die ausgewählten Zellen in einen neuen DataTable packen.

Also ich schon folgendes probiert:
Ich lese die SelectedRows aus dem DGV aus und wollte sie dem neuen DataTable hinzufügen, aber das ging nicht, weil ich vorher die Spalten des DataTables nicht definiert habe. Da die Spaltenanzahl variieren kann, kann ich das nicht vorher festlegen.
Meine Idee war dann die Columcollection des DatagridViews dem Data Table zu übergeben: Problem das geht nicht, weil ich die DGVColumnCollection nicht in DataColumns casten kann.

Jetzt eben hab ich nochmal probiert ob ich die DGVSelectedCells nicht iwie an den Data Table übergeben kann, aber das geht auch nicht.

Hat da jemand ne Idee wie ich da einfach wieder an die Daten rankomme außer die in einer Schleife alle einzeln durchzugehen?

Viele Grüße
Siedlerchr

16.04.2010 - 15:56 Uhr

Ah, danke für die schnelle Antwort, mir ist das ganze grade etwas klarer geworden, vorallem was die Abhänigkeit angeht.

Wie komm ich jetzt in der Logik Klasse an die Daten aus der GUI dran ...

der Logik-Klasse sollte bzw. muss es ganz egal sein, woher die Daten kommen. Es ist erst recht nicht Aufgabe der Logik-Klasse, sich die Daten zu besorgen. Es ist Aufgabe des GUIs, die Daten zu übertragen. In vielen Fällen am einfachsten und besten geht das mit DataBinding

Ich hab das immer andersrum verstanden gehabt, aber so macht es eigentlich Sinn.

Das bringt mich schon weiter.

16.04.2010 - 14:39 Uhr

Hallo Leute, ich habe Probleme bei der Umsetung "Trennung von GUI und Logik"

Also die Theorie usw hab ich soweit verstanden, nur ich weiß nicht wie ich das umsetzen soll.

In der Gui Klasse hab ich die Methoden getDSN(); getUserID() ujnd getPwd(); die aus der Gui die Werte aus der Textbox auslesen.

Die DB Funktionalität hab ich in einer eigenen Klasse.

Mein Ansatz ist jetzt, dass ich noch eine Klasse mit der Logik des Programms mache in der ich dann das Anmelden an einer DB durchführe.

Wie komm ich jetzt in der Logik Klasse an die Daten aus der GUI dran und wie kann ich andersrum sagen, dass ich wenn ich einen Button drücke in der Logik Klasse was passieren soll?

Also beim zweiten Punkt hab ich versucht das mit einem EventListener zu machen, habs aber nicht so hinbekommen.

Interfaces hab ich mir auch schon angesehen, aber das hat mich bei meinem 1. Problem auch nicht weitergebracht, zumindest nicht die Beispiele.

Es wäre gut, wenn mal jemand ein Beispiel dazu hat, weil ich das momentan nicht so direkt verstehe.

Gruß
Siedlerchr

15.03.2010 - 15:47 Uhr

Ich hätte jetzt spontan auf ein Sleep gesetzt wie z.B. in Thread.Sleep...

Beispiel:
http://dotnetperls.com/sleep

11.03.2010 - 14:55 Uhr

Soweit ich das in Erinnerung habe geht das nicht, du könntest höchstens quasi in die 1. spalte (im DGV Spalte 0 ) deine Beschreibung einfügen und dann entsprechend auf den Index zugreifen.

11.03.2010 - 14:51 Uhr

Wie schauts denn mit Render aus:
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.formview_methods.aspx

Render	  

Displays the FormView control on the client. (Overrides WebControl..::.Render(HtmlTextWriter).)

Ansonste wäre mein Frage wie du das ganze das erste Mal nach dem erstellen aufrufst, bzw anzeigst?

11.03.2010 - 13:46 Uhr

Meine Vermutung ist, dass du nochmal eine Funktion wie Show oder Draw aufrufen (die die fürs anzeigen da ist) musst, wenn du die Daten des FormView Elements veränderst, damit die Anzeige auch aktualisiert wird.

Also quasi nochmal das FormView mit den neuen Daten "neu zeichnen" (ich weiß jetzt nicht wie die Methode zum Anzeigen heißt, wahrscheinlich show )

11.03.2010 - 10:58 Uhr

Klasse Sache, dann wird das Forum hier ja richtig berühmt.

Da heise.de eine der besucherstärksten deutschen Websites ist (in den Top 50 des IVW-Rankings) könnte leider selbst dann der myCSharp.de Server in die Knie gehen, wenn sich aufgrund des Interviews nur ein Bruchteil der Heise-Leser heute oder im Verlauf der Woche myCSharp.de mal angucken will.

Das nennt man geheised: 😉

Heise-DDoS
aus HeiseForenWiki, der freien Wissensdatenbank
Wechseln zu: Navigation, Suche

Der Effekt, wenn viele Internet-Nutzer quasi gleichzeitig einen Link, der z.B. in einer Newsticker-Meldung oder einem Post veröffentlicht wurde, besuchen. Dies kann dazu führen, daß der betroffene Server überlastet wird und die Seite zeitweise nicht mehr erreichbar ist. Auch als Slashdot-Effekt bekannt, ein Sonderfall ist das sog. Heisen.

Quelle: http://heise.forenwiki.de/index.php?title=Heise-DDoS

11.03.2010 - 10:48 Uhr

Das mit den Buttons ist ja jetzt echt schön gemacht, habs auf dem screenshot gesehen, aber noch nicht ausprobiert.

Mir ist noch etwas eingefallen, bezüglich des Kalenders:
Also ich fänd das gut wenn man entscheiden könnte welchen Kalender man öffnen möchte: Den eigenen oder man gibt einen Namen ein -> der Kalender der entsprechenden Person wird dann geöffnet.

Wenn du das umsetzt, freue ich mich drauf =)

10.03.2010 - 10:21 Uhr

Also ich hatte mir das so vorgestellt:

Das ich die aus dem Standrad globalen Adressbuch auswählen kann und dort suchen kann.

Und bezüglich Kalendar, einfach nur das der auf die Kalenderansicht springt und imPrinzip standardmäßig meinen Kalendar anzeigt.

09.03.2010 - 08:44 Uhr

Hallo,

erstmal ein großes Lob, das Programm ist echt super praktisch!

Ich hätte da noch Verbesserungsvorschläge

Da wir bei uns in der Firma keine Kontakte in Outlook hinterlegt haben, wäre es sinvoll wenn man im Adressbuch suchen könnte.

Und was ich noch toll fände, wenn man per Shortcut direkt den Kalender öffnen kann, anstatt das man erst Outlook öffnen muss um darauf zuzugreifen.

Aber ansonstn einige nützliche Funktionen.
👍

08.03.2010 - 19:13 Uhr

Ja, ich verstehe jetzt wo mein Fehler liegt! Ich hab mir schon fast gedacht, dass das evtl ein InstanzProblem ist.

Ich versuche morgen mal das ganze umzusetzen.

OutputDevice kannst du dann sogar als abstrakt kennzeichnen, oder aber du gibst in WriteOutput standardmäßig was auf der Console aus...
Auf diese Art und Weise könntest du auch noch einen OutputConsoleWriter, OutputXmlWriter, OutputLogWriter,...erstellen.
Ich hoffe jetzt ist es klarer.

Das hatte ich grundsätzlich eh vorgehabt das ich mehrere OutputWriter Sachen habe.

Eine Frage hab ich jetzt noch:

Wie kann ich den jetzt unterscheiden welchen Writer ich benutzen will ?
Also ich hab dann die Klassen OutputXMLWriter, ConsoleWriter, FileWriter die alle von der OutputDevice erben.
Mir erschließt sich jetzt grade nicht wie ich dann unterscheiden kann welchen Writer ich benutzen will...

08.03.2010 - 16:20 Uhr

Also ich erzeuge in der Methode WriteOutput in OutputDevice eine Instanz vom FileWriter:

  public void WriteOutput(List<string> adressList)
        {
            
            if (this.outputDeviceName.ToUpper() == "FILE" && File.Exists(outputPath))
            {
                OutputFileWriter fileWriter = new OutputFileWriter(); 
                fileWriter.WriteOutputToFile(adressList);
            }

Und was das Exception Handling angeht:

In der KLasse OutputFileWriter wird die Methode
WriteOutputToFile aufgerufen, in der die Daten in eine Datei geschrieben werden.
Dort fang ich die Exception ab:


 class OutputFileWriter  : OutputDevice
    {

        public void WriteOutputToFile(List<string> adressList)
        {

            string outputPath = Path;
            bool append = true;


            try
            {
                outputPath = ""; //Um eine Exception zu provozieren
                using (StreamWriter outputWriter = new StreamWriter(outputPath, append, Encoding.Default))
                {

                    foreach (string line in adressList)
                    {

                        outputWriter.WriteLine(line);
                    }
                }

            }
            catch (IOException e)
            {
                base.Error = e.Message;
            }
            catch (Exception e)
            {
                base.Error  = e.Message;
            }
          
        }

    }

Also ich hab mir folgendes gedacht. Ich hab ja eine Instanz der Oberklasse initalisiert, ganz am Anfang und müsste doch da auch in der Unterklasse(die geerbte) drauf zugreifen können. DAs ist das was ich nicht so ganz nachvollziehen kann warum es da nicht geht.

08.03.2010 - 15:31 Uhr

Hallo,

ich hab hier ein kleines Problem was ich nicht so ganz nachvollziehen kann:

Ich habe eine Klasse OutputDevice und eine Klasse OuptutFileWriter die von OutputDevice erbt.

Die Klasse OutputDevice hat das Property Error.

Was ich jetzt gemacht hab ist folgendes:
In der Unterklasse wird die Property Error der Klasse OutputDevice gesetzt.
Soweit in Ordnung.

Nur wenn ich mir dann widerum aus einer anderen Klasse (AdressGenerator, dort hab ich eine Instanz von OutPutDevice) die Error Property ausgeben möchte, dann bekomme ich immer NULL zurück.

Woran liegts? Hier noch ein paar Codeschnipsel wie ichs gemacht habe:

Klasse AdressGenerator

 OutputDevice outputDevice = new OutputDevice();
                outputDevice.Device = "File";
                outputDevice.Path = outputPath;
                outputDevice.WriteOutput(chosenAddresses);
                msgHandler.WriteOutput(outputDevice.Error);

Hier das entsprechende Stück aus der OutputDevice Klasse


class OutputDevice

OutputFileWriter fileWriter = new OutputFileWriter(); 
                fileWriter.WriteOutputToFile(adressList);

Und in der OutputFileWriter Klasse fang ich ne Exception ab und setze die in die Error Property der OutputDevice Klasse


class OutputFileWriter  : OutputDevice

  catch (Exception e)
            {
                base.Error  = e.Message;
            }

Was mir jetzt unklar ist, warum die Eigenschaft dann auf einmal wieder auf NULL gesetzt wird, weil ich erzeuge ja keine neue Instanz o.Ä. , eigentlich sollte der mir ja den Text der Exception anzeigen.

08.03.2010 - 15:15 Uhr

Ok, ich hab das Skript mal etwas anonymisiert und gekürzt:

BEGIN
   DECLARE pos int;
	DECLARE anz int;

      
   SET pos = (SELECT LfdNr FROM Tabelle WHERE Name =  'blub')
   SET anz = (SELECT Count(*) FROM Tabelle )
   
   
   INSERT INTO Tabelle (ID,name, LfdNr) 
    		Values ( 
    		(varId,
    		'2BLUB2',
    		pos + 1
    		);
   
   WHILE anz > pos loop
    		IF Exists (SELECT LfdNr FROM Tabelle  WHERE LfdNr = anz AND Name = 'IrgendEinblub') THEN
    				UPDATE Tabelle
    				SET LfdNr = anz + 1 
    				WHERE LfdNr = anz  AND ID != (SELECT ID FROM Tabelle WHERE Kennung = 'xyz'); 
    		END IF;	
    		COMMIT;
    		SET anz = anz - 1;
    	END loop; 
    	
   END LOOP loopBlub;

END;

Kurze Erklärung:
DAs nimmt jeden Eintrag in der Tabelle (fängt mit dem letzten an) und setzt die LfdNr immer um 1 nach oben.

Bezüglich des Inserts: Das wird hinter einem bestehenden Datensatz eingefügt.
Bsp: Blub als Name hat LfdNr 2
=> Insert kriegt gleich die LfdNr 3
und alle anderen in der Tabelle werden um 1 hochgesetzt(s.o)

In meinem Anwendungsfall hab ich da noch nen Cursor drum rumgebaut weil das für verschiedene Kategorien ausgeführt werden sollte.

Das Skript ist syntaktisch für Sybase Asa 9 geschrieben, weil ich damit in der Firma arbeite, muss halt für andere DB-Systeme angepasst werden.

Wenn du noch fragen dazu haben solltest, dann gerne PN.

Gruß
Siedlerchr