Laden...

Forenbeiträge von tristar Ingesamt 98 Beiträge

02.12.2019 - 11:41 Uhr

Leider wird immer noch nicht korrekt gefiltert.
Der Teil der Preisprüfung p.preisgeprueft == true && scheint ignoriert zu werden.

Ich habe Artikel, die nur gezählt werden oder wo der Bestand 0 ist. Diese werden korrekterweise nicht angezeigt.
Muss ich die Tabellen anderst verknüpfen?

Edit:
Nun habe ich für die Preistabelle ebenfalls noch die Id mit in die Bedingung aufgenommen und nun klappt es. Vielen Dank für die Hilfe!


....
i.inventurid == iIdInventur &&
p.inventurid == iIdInventur &&
...

02.12.2019 - 07:46 Uhr

verwendetes Datenbanksystem: <MySQL>

Guten Morgen,
ich habe folgende Abfrage, bei der eigentlich nur die Daten angezeigt werden sollen,
-wo der Bestand > 0
-Preis geprüft = true
-Bestand gezählt = true
ist.

In der Ausgabe erscheinen leider aber alle Datensätze, deren Bestand gezählt wurde, aber noch kein Preis geprüft wurde.
Was ist an meiner Abfrage falsch??


var total =
                                        (from i in ctx.tblInventurLager
                                         join p in ctx.TblPreise on i.artikelnummer equals p.artikelnummer
                                         where i.gezaehlt == true
                                         where p.preisgeprueft == true
                                         where i.inventurid == iIdInventur
                                         where i.bestand > 0
                                         orderby i.artikelnummer
                                         group i by i.artikelnummer into Nummer
                                         select new Inventur
                                         {
                                             Artikelnummer = Nummer.Key,
                                             Bestand = (double)Nummer.Sum(x => x.bestand)
                                         }).ToList();

28.11.2019 - 22:16 Uhr

Guten Abend zusammen,

gibt es WindowsForms eine Möglichkeit, dass die Form in der Größe dynamisch geändert werden kann?

Manchmal habe ich so etwas in der Art gesehen, dann waren unten rechts am Fenster schräg Punkte zu erkennen. Geht das über MDI?

D.h. wenn das Fenster der Form größer gezogen wird, dass sich dann auch die Steuerelemente entsprechend in ihrer Größe ändern? Oder geht das nur über WPF?

28.11.2019 - 22:13 Uhr

Guten Abend zusammen,
ich habe in meinem Projekt relativ viele WindowsForms erstellt.
Nun würde ich gerne zur besseren Menüführung eine Menüleiste (MenuStrip) einbauen.
Das klappt soweit auch alles problemlos.

Ein Teil der Menüleiste soll auf jeder Form gleich sein. Je nach Form kommen dann eben andere Menüpunkte hinzu.

Nun meine Frage, muss ich für jede Form die Menüleiste neu erstellen, oder gibt es auch eine Möglichkeit, diese einfach immer einzubinden? Copy-Paste?

18.12.2017 - 22:37 Uhr

Ich versuche das ganze nun mit Hilfe von iTextSharp zu lösen.

Hat damit jemand Erfahrung?
Ich erhalte folgende Fehlermeldung: > Fehlermeldung:

iTextSharp.text.pdf.PdfWriter" enthält keine Definition für "PDFA1B".

Hier noch der Code dazu:


 Document doc = new Document(PageSize.A4);
            PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream("C:\\test_A1-b.pdf", FileMode.Create));
            writer.PDFXConformance = PdfWriter.PDFA1B;
            doc.Open();

Könnt ihr mir vielleicht sagen, woran das Problem liegt?

16.12.2017 - 20:26 Uhr

Aus der Doku weiß ich schon, dass nur 1.3 möglich ist.
Ich dachte bei meiner (zugegeben wohl ungenauen) Frage eher an eine Art Umweg.

Momentan habe ich die Idee mit dem ReportViewer eine pdf (1.3) zu erzeugen und zu speichern.
Anschließend "hole" ich mir die Datei wieder und übergebe sie an einen installierten pdf-Drucker, der die Datei dann im Format 1.4 wieder speichert.


public void Drucken(string druckername, string dateiname)
{
	    try
              {
                    PrintDocument pd = new PrintDocument();
                    pd.PrinterSettings.PrinterName = druckername;

                    System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo(dateiname);
                    info.Arguments = pd.PrinterSettings.PrinterName;                  
                    info.CreateNoWindow = true;
                    info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
                    info.UseShellExecute = true;
                    info.Verb = "Print";
                    info.WorkingDirectory = "C:\temp";
                    System.Diagnostics.Process.Start(info);

	    }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
}

Nun habe ich dabei aber noch die folgenden Probleme:
-zum einen wird der Acrobat Reader geöffnet, was an dieser Stelle nicht erwünscht ist
-die Datei wird auch korrekt an den "Druckservice" übergeben bzw. der richtige Drucker ausgewählt, nun soll aber von dort das Dokument wieder automatisch gespeichert und das Programm geschlossen werden.
Hat dazu jemand eine Idee??

15.12.2017 - 12:05 Uhr

Hallo,

aktuell werden die über RLDC erstellten pdf als Format 1.3 ausgegeben.
Weiß jemand, ob es auch eine Möglichkeit gibt, diese im Format 1.4 (Format A) auszugeben?
Und falls ja, wie???
Danke für eure Hilfe!!!

19.10.2017 - 16:27 Uhr

VS schließen/öffnen bringt leider keinen Erfolg.
Ebensowenig das Projekt neu zu erstellen.

Es scheint, wie wenn "alte" Daten verwendet werden, also alte Klassen werden die neuen Properties nicht berücksichtigt und neue Klassen gar nicht erst berücksichtigt.

19.10.2017 - 14:02 Uhr

Hallo zusammen,

in meinem Projekt habe ich über "Datenquellen" -> "Neue Datenquelle hinzufügen" als Datenquelltyp ein Objekt ausgewählt und dies dann mit den Klassen des Projekts gebunden.

Nun habe ich die folgenden beiden Probleme:
-Ändere ich an einer bestehenden Klasse etwas (z.B. Hinzufügen einer neuen Eigenschaft), so wird dies bei der Datenquelle nicht aktualisiert obwohl ich mehrfach aktualisiert habe und auch das Projekt neu erstellt habe.

-Erstelle ich eine ganz neue Klasse, so erscheint diese erst gar nicht im Dialog um sie zu binden.

Ich habe auch schon die gebundenen Klassen gelöscht und wieder neu hinzugefügt, jedoch bleiben die oben genannten Probleme bestehen.

Muss ich an einer anderen Stelle etwas ändern?
Oder was übersehe ich, dass meine Änderungen an dieser Stelle nicht beachtet werden?

Danke für Eure Hilfe!!

13.09.2017 - 07:37 Uhr

Super danke!
So einen Ansatz habe ich gebraucht. Den Rest schaffe ich nun alleine 😉

13.09.2017 - 07:00 Uhr

Mein Problem: Ich bin zu blöd - stehe gerade komplett auf dem Schlauch - , wie ich händisch den nächsten Datensatz anzeigen lasse.
D.h. in die foreach-Schleife am Ende die Abfrage?

13.09.2017 - 06:31 Uhr

Hallo,

leider ist mir kein besserer Titel eingefallen.

Ich habe eine Liste mit Angaben, die ausgedruckt werden sollen.
Bevor jedoch gedruckt wird, soll der Benutzer bei jedem Element prüfen (=Textboxen/Labels auf der Form) können, ob die Daten korrekt sind.
Wenn er damit einverstanden ist, dann soll per Button das Element gedruckt werden und das nächste Element der Liste wird angezeigt, kann geprüft und anschließend gedruckt werden usw.

Ich kann zwar die einzelnen Element der Liste durchlaufen, aber wie muss ich es umsetzen, damit erst beim Button-Click das nächste Element erscheint?
Danke für Eure Hilfe!

01.07.2017 - 12:37 Uhr

Und im erweiterten Modus.
Die Eigenschaften rechts zeigen die eingestellten Werte für die oberste static-Zeile

Geht es überhaupt, dass die Zeilen wiederholt werden?
Bisher hat noch keine Änderung überhaupt etwas bewirkt. 😦

01.07.2017 - 12:35 Uhr

Hallo schon wieder,

meine erstellten Berichte exportiere ich als Word.
Nun habe ich festgestellt, dass im Worddokument die Überschrift der Tablix nicht auf jeder Seite wiederholt werden und auch der Seitenumbruch ist teilweise mitten in einer Gruppe.

Folgendes habe ich bereits versucht:
-Tablixeigenschaft (siehe Bild)

01.07.2017 - 12:13 Uhr

@witte
Dankeschön für die Hilfe! Hab es hin bekommen!

26.06.2017 - 06:39 Uhr

Hallo,

abschließend noch eine Frage.
Ich erstelle einen Lieferschein und als Gruppen habe ich übergeordnet einen Lieferschein und darunter eine einzelne Bestellposition.
Nun würde ich gerne, nur einmalig die Lieferscheinnummer anzeigen, d.h. nicht bei jeder zugehörigen Bestellposition. Und bei jeder weiteren Lieferscheinnummer ebenso verfahren.

Lieferscheinnummer1
Pos1
Pos2
Pos3

Lieferscheinnummer2
Pos4
Pos5

Lieferscheinnummer3
...

usw.

Muss ich dies über einen Ausdruck umsetzen?
Bisher habe ich noch nichts entsprechendes gefunden.

26.06.2017 - 06:36 Uhr

Ich habe es nun so gelöst, dass ich für die entsprechenden Daten eine neue Zeile erstelle. Je nachdem ob Daten enthalten sind, verwende ich einen Ausdruck, um die Zeile anzuzeigen oder eben nicht.

19.06.2017 - 14:09 Uhr

Hallo,
leider bin ich immer noch nicht weiter gekommen. 😦
Beim Suchen bin ich auf diesen Foren-Eintrag gestossen, welcher wie von Euch beschrieben das selbe Vorgehen empfielt. http://www.mycsharp.de/wbb2/thread.php?threadid=112540

Leider verstehe ich nicht, wie ich einzelne Daten dan "weg lassen" kann?!?!

Ich habe Daten für einen Lieferschein. Diese Daten lese ich in eine List<Lieferschein> ein und diese übergebe ich dem Report.

Nun kann es sein, dass eine Position nicht vollständig beliefert werden kann und eine Restmenge offen bleibt. Diese Restmenge würde ich dann eben gerne in der Zelle der Lieferanzahl zusätzlich anzeigen wollen.
Ebenso gibt es zu manchen Positionen Bemerkungen.

Prinzipiell funktioniert es ja auch ... nur habe ich die folgenden beiden Probleme:
-Für die Restmenge schreibe ich auch den Text "Restmenge" in die Zelle. Ist die Menge nun 0, wie kann ich verhindern, dass der Text angezeigt wird (also nur dieser Text, nicht die eigentliche Liefermenge).

-Bemerkung: Wir kann ich verhindern, dass für die Bemerkung eine Zeile "reserviert" wird. So ist meine Zeile teilweise extrem hoch, obwohl kein Text drin steht.

Hoffe ihr könnte mir helfen - bin so langsam echt am Verzweifeln! Danke!

12.06.2017 - 20:44 Uhr

Sorry, irgendwie steh ich echt auf dem Schlauch.
Ich habe es auch schon mit einem Ausdruck für ein Feld probiert:

=IIF(First(Fields!Restmenge.Value)=0, true, false)

Nun steht allerdings immer TRUE oder FALSE in meinem Feld und keine Werte bzw nicht ausgeblendet??

12.06.2017 - 12:29 Uhr

Hm, ok. Nur wie mache ich das?
Oder zumindest ein Stichwort, wonach ich suchen muss?

Mein Problem dabei ist folgendes:
Die Tablix hat 4 Spalten. In der ersten Spalte gebe ich eine Menge sowie eine Restmenge an.
D.h. wenn die Restmenge = 0 ist, dann soll weder der Text Restmenge noch eine Zahl auftauchen.

Und in der 3 Spalte sind die Felder Bezeichnung, Vertragsnummer und Bemerkung. Ist eine Vertragsnummer oder eine Bemekrung vorhanden, soll diese eben angezeigt werden oder nicht.

Der einizige Weg, den ich bisher zum ausblenden gefunden habe, war über die Gruppeneigenschaft.
Aber das ist sicher falsch. Denn wenn ich dort für die Restmenge.Value / Operator <> / Wert 0 eintrage, dann wird meine gesamte Zeile ausgeblendet.
Jedoch sollen natürlich alle anderen Werte angezeigt werden .... wie kann ich dies also auf nur ein Feld beziehen?

12.06.2017 - 06:04 Uhr

Hallo,

wie kann ich es bei der Erstellung von Berichten umsetzen, dass wenn ich ein Feld (=Fields!Bemerkung.Value) einfüge - falls dieses leer ist - auch keine Leerzeile eingefügt wird?

21.04.2017 - 22:56 Uhr

Als Datenquelle für meine Bericht nutze ich Klassen.

Bisher ging es immer problemlos, wenn ich einen Bericht erstellt habe, dass ich über neues DataSet hinzufügen als Datenquelle "Projektname.Classes" ausgewählt habe und dann bei den verfügbaren DataSets meine Klasse.

Nun habe ich eine neue Klasse erstellt und was ich auch gemacht habe (F6, VS auf zu), die Klasse konnte ich nicht einbinden (Datenquelle => Neu => Objekt => Projektname => Projektname.Classes ===> die Klasse wurde einfach nicht angezeigt).

Kann mir bitte jemand sagen, wie ich auch eine später erstellte Klasse verwenden kann??
Danke!

07.04.2017 - 21:24 Uhr

Hallo,

ich stehe gerade auf dem Schlauch was das Anzeigen einer Textbox abhängig vom Wert betrifft.
Ich erstelle einen Lieferschein. Alle Daten des Lieferscheins sind in DataSetLieferschein.
Dort gibt es u.a. ein Feld Sendungsnummer und Ziffernfolge.

Nun möchte ich gerne, dass diese beiden Felder angezeigt werden, wenn sie nicht leer bzw. 0 sind.

Entweder sehe ich den Wald vo lauter Bäume nicht mehr, aber ich bin folgendermaßen vorgegangen: Ich ziehe das Feld "Sendungsnummer" sowie "Ziffernfolge" auf das Formular und im Bereich Sichtbarkeit füge ich einen Ausdruck (ja nach Ausdruck ein-/ausblenden) ein.

Für die Sendungnummer:

=Not(String.IsNullOrEmpty(First(Fields!Sendungsnummer.Value, "DataSetLieferschein")))

Das Feld wird nun jedoch immer ausgeblendet, auch wenn in der DB ein Wert steht.
Ist mein Vorgehen falsch bzw wo liegt der Fehler?

Bei der Ziffernfolge bekomme ich nur Fehlermeldungen mit meinen Ausdrücken. Wie muss ich den Ausdruck von der "Sendungsnummer" für Zahlen entsprechend anpassen?

Danek für eure Hilfe!!

07.04.2017 - 21:12 Uhr

Danke euch beiden! Ich habe die Textboxen nochmal gelöscht und neu erstellt. Dann ist der Zeilenumbruch verschwunden. Der einzige Weg, wie ich wieder einen Zeielnumbruch erzeugen konnte, war durch das Voranstellen eines Leerzeichens. Dies funktionert aber viel ordentlich mit Hilfe von Padding, weshalb es nun anscheinen klappt?!

03.04.2017 - 13:51 Uhr

Hier noch die Ausgabe in Word.

03.04.2017 - 13:49 Uhr

Okay, dann werde ich ein wenig probieren.

Eine Frage noch zu Textboxen.
Im Designer sind diese ordentlich angeordnet, in Word sieht es aus, wie wenn ein Zeilenumbruch in der Textbox wäre.
Allerdings habe ich diesen Textboxen die Eigenschaft CanGrow = false zugewiesen.
Hat dazu jemand eine Idee, wie ich dies verhindern kann??

29.03.2017 - 06:35 Uhr

Hallo,

ich arbeite erst seit kurzem mit Reports (RDLC). Das Anbinden der Daten funktioniert inzwischen prima.
Nun habe ich allerdings noch folgendes Problem:
In der Entwurfsansicht des Berichtes passen alle Daten auf eine Seitenbreite. In den Berichtseigenschaften habe ich Hochformat und DIN A4 eingestellt.

Wird der Bericht erstellt, so sieht es auf der Form, die ein ReportViewer Control enthält auch gut (=alles auf einer Seite) aus.
Exportiere ich nun die Daten aber als PDF oder Word, so werden plötzlich die Daten am rechten Seitenrand abgeschnitten und bei den Daten aus der Tablix werden nach der zweiten Spalte rechts abgeschnitten, obwohl noch viel Platz nach rechts wäre (zumindest scheint es so).

Z.B.: Im Header Bereich verwende ich Textboxen zur Anzeige der Seiten(jedes Wort hat eine eigene Textbox): Seite 1 von x
In der Vorschau sieht dies erneut korrekt aus, beim Export ist dann sogar das Wort Seite auf zwei Zeilen verteilt, die Daten darüber aber korrekt in einer Zeile ... ???

Es scheint zumindest, dass die Auflösung der Vorschau nicht mit der tatsächlichen der Ausgabe überein stimmt. Weshalb? Und was muss ich anpassen, damit die Vorschau auch der tatsächlichen Ausgabe (Export PDF, Word) entspricht?

Danke euch!

Anbei mal noch ein Bild wie die Darstellung der Seitenzahlen im Entwurf und bei der Ausgabe aussehen.

23.02.2017 - 21:40 Uhr

Über ein Textfeld im Seitenfuss erhalte ich nun jeweils die Summe der Seite: =Sum(ReportItems!Textbox150.Value)

Jetzt wäre es noch toll, wenn mir jemand helfen könnte, wie ich denn die Summen der Seiten aufsummieren kann.

Seite 1
Artikel1 100,00 €
Artikel2 100,00 €
Artikel3 100,00 €
SUMME auf Seite 1 300,00€

Seite 2
Artikel4 200,00 €
Artikel5 200,00 €
Artikel6 100,00 €
SUMME auf Seite 2 800,00€

Seite 3
Artikel7 100,00 €
Artikel8 50,00 €
Artikel9 50,00 €
GESAMTSUMME 1000,00 €

23.02.2017 - 09:08 Uhr

Irgendwie steh ich da gerade echt auf dem Schlauch.

Ich habe eine Tabelle in den Report eingefügt und dort jede Position gruppiert. Anschließend eine Zeile unterhalb der Gruppe eingefügt.
In dieser Zeile hab ich folgende beide Varianten getestet.

=Sum(ReportItems!Gesamtpreis.Value)
=RunningValue(Fields!Gesamtpreis.Value, Sum, Nothing)

Dadurch erhalte ich zwar die Zwischensummen, aber nach jeder Position.
Wie kann ich es entsprechend ändern, dass es nur am Seitenende auftaucht?

Und ist eine Tabelle das richtige Control dafür, oder muss ich eine Matrix oder eine Liste (befüllt mit Textboxen) verwenden?

21.02.2017 - 14:24 Uhr

Hallo,

ich würde gerne einen Report (ReportViewer) für Rechnungen erstellen.
Das Berechnen der Gesamtsumme klappt auch [Sum(NettopreisGesamt)].

Nun komme ich auch folgende Probleme bei längeren Rechnungen:
-Wie kann ich am Ende einer Seite die Summe für den Übertrag bilden? Natürlich nicht auf der letzten Seite.
-Auf der letzten Seite soll die Nettosumme stehen (klappt) und dann soll aus dem Betrag die MwSt berechnet und anschließend als Gesamtsumme ausgegeben werden (also jeweils in eine Zelle).
Also so:

NETTOSUMME 100,00 €
MwSt 19,00 €
GESAMT 119,00 €

Danke für Eure Hilfe!

21.02.2017 - 14:17 Uhr

Danke! Mache die Abprüfung nun direkt bei der Abfrage.

17.02.2017 - 06:20 Uhr

Guten Morgen =)

Meine Daten für den Report kommen aus einer Klasse. Die Klasse verwende ich dann als DataSet.
Und der Aufruf für den Report sieht so aus:


this.AuftragBindingSource.DataSource = DB_Abfrage.AuftragdatenZuKundeId(iKundeId);

Nun würde ich gerne, wenn eine Kundenartikelbezeichnung vorliegt, diese im Bericht anzeigen lassen und falls keine hinterlegt ist, die Standardbezeichnung. Wie kann ich dies dem Report "sagen"?

Danke Euch!

08.02.2017 - 21:26 Uhr

Super! Danke euch beiden noch für die Tipps!

28.12.2016 - 20:43 Uhr

Das geht, aber Du musst alle Felder und Datasets in der Datenquelle angeben.

Blöde Frage, aber WO muss ich es in der Datenquelle angeben?
In der XML Datei des Report steht bei DataSource nur der Ordner "Classes", in welchem meine Klassen sind.


<DataSource Name="Classes">
      <ConnectionProperties>
        <DataProvider>System.Data.DataSet</DataProvider>
        <ConnectString>/* Local Connection */</ConnectString>
      </ConnectionProperties>
      <rd:DataSourceID>xxx</rd:DataSourceID>
    </DataSource>

Im Header (Textfelder) sollen Daten aus DataSet1 verwendet werden, im Textkörper (Tablix) sollen dann Daten aus DataSet2 verwendet werden.

28.12.2016 - 14:53 Uhr

Hallo,

ich versuche gerade einen Bericht mit Hilfe des Report Viewers zu erstellen.
Dazu binde ich meine Klassen als Objekte ein.
So kann ich dann auch ein DataSet zum Bericht hinzufügen und die gewünschten Daten werden angezeigt. Soweit so gut.

Jetzt möchte ich aber noch Daten aus einem anderen DataSet (also eine andere Klasse) dem Bericht hinzufügen. Das Hinzufügen des DataSet klappt auch, nur wenn ich nun ein Datenfeld hinzufüge und das Projekt starten möchte, so erhalte ich die Fehlermeldung

Fehlermeldung:
Ein Ausdruck für ein Berichtselement kann nur auf Felder verweisen, die sich im aktuellen Datasetbereich oder, wenn der Ausdruck zu einer Aggregatfunktion gehört, im angegebenen Datasetbereich befinden.

Geht es nicht, dass ich Daten aus mehren DataSets einem Bericht hinzufüge?
Oder wie kann ich das Problem lösen?

Danke euch!

10.12.2016 - 21:18 Uhr

Danke für Deine Hilfe! Leider klappt es immer noch nicht.
In der Zeile des Setter für das Objekt erhalte ich die Fehlermeldung: > Fehlermeldung:

Einer Eigenschaft oder einem Indexer "System.Windows.Forms.BindingSource.Current" kann nichts zugewiesen werden -- sie sind schreibgeschützt

  
Person m_CurrentPerson  
{  
    get{ return m_PersonBindingSource.Current as Person;}  
    set{ m_PersonBindingSource.Current = value;}  
}  
  
  

Muss ich dazu an meiner Klasse selbst noch etwas ändern?

09.12.2016 - 21:20 Uhr

Jetzt habe ich gehofft, dass ich nun endlich die Lösung habe.


BindingSource bs = new BindingSource();
BindingList<Person> bList = new BindingList<Person>();
Person p = new Person();

public Form1()
{
            InitializeComponent();

            bs.DataSource = typeof(Person);

            List<Person> list = DB_Abfrage.GetPersonen();
            bList = new BindingList<Person>(list);
            dataGridView1.AutoGenerateColumns = true;
            bs.DataSource = bList;

            dataGridView1.DataSource = bList;
            textBox1.DataBindings.Add("Text", this.p, "Name", true, DataSourceUpdateMode.OnPropertyChanged);
}


private void btnNeuePerson_Click(object sender, EventArgs e)
{
     p.Name = "";
     p.Name = textBox1.Text;
}


// Aktuell ausgewählte Zeile als Objekt übergeben.
 private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1)
            {
                p = (Person)dataGridView1.CurrentRow.DataBoundItem;             
            }
        }

Jetzt bleibt meine TextBox allerdings komplett leer, obwohl mein Objekt Daten enthält - weshalb?

09.12.2016 - 16:32 Uhr

Ich raff es einfach nicht 😦 Langsam bin ich echt am Verzweifeln


       // ...


        public String Name
        {
            get { return _name}
            set
            {
                if (value == "")
                {
                    return;
                }

                _name= value;
                NotifyPropertyChanged("Name");
            }
        }


       // ....



        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }











       BindingSource bs = new BindingSource();
       BindingList<Person> bList = new BindingList<Person>();
       Person p = new Person();


        public F_Textbausteine()
        {
            InitializeComponent();

            bs.DataSource = typeof(Person);

            List<Person> list = DB_Abfrage.GetPersonen();
            bList = new BindingList<Person>(list);
            dataGridView1.AutoGenerateColumns = true;
            bs.DataSource = bList;

            dataGridView1.DataSource = bList;
            textBox1.DataBindings.Add("Text", bList, "Name", true, DataSourceUpdateMode.OnPropertyChanged);
        }

        private void btnNeuePerson_Click(object sender, EventArgs e)
        {
            p = new Person();
	    p.Name = textBox1.Text;
        }


 	private void textBox1_TextChanged(object sender, EventArgs e)
        {
           
        }

        private void btnSpeichern_Click(object sender, EventArgs e)
        {
	    bList.Add(p);
            bs.EndEdit();
        }
    }

Ich verstehe einfach nicht, wie ich die Textbox leer bekomme, um einen neuen Datensatz eintragen zu können?

Muss ich z.B. zum Speichern eines neuen Datensatzes ein INSERT schreiben, diesem das neue Objekt (p) übergeben. Und anschließend die Liste wieder neu Laden?

Und greif ich beim UPDATE einfach die Spalte ID ab, übergebe diese an die UPDATE Funktion, ändere die Daten und lade die Liste wieder neu?

Ich glaub ich seh den Wald vor lauter Bäumen nicht mehr ... 😦 Leider helfen mir die ganzen Beispiele die ich finde nicht weiter (oder ich kapiers einfach nicht).

09.12.2016 - 08:22 Uhr

Guten Morgen 😃

Nachdem ich nun immer wieder von DataBinding lese (und inzwischen auch selbst Vorteile sehe), habe ich mich an einem kleinen Beispiel versucht.
Leider tauchen immer noch einige Fragen auf und bin auch teilweise verwirrt, was wann wie verwenden 😦
Ich hoffe, jemand von euch ist geduldig genug, mir dies so zu erklären, damit ich es endlich verstehe!

Zuerst, wann wird List<Klasse>, BindingList<Klasse>, IEnumerable<Klasse>, DataTable (zur Anzeige der Daten) verwendet? Im Prinzip kann ich ja alles als DataSource verwenden und binden.
Was ist "Standard"?

Für einen einzelnen Datensatz genügt es ja, das Klassenobjekt zurück zu geben bzw. zu binden?

Wann/wofür benötige ich INotifyPropertyChanged?

Nun noch mein Beispiel, Fragen habe kommentiert



public class Person
{
    public int Id { get; set; }
    public string Vorname { get; set; }
    public string Name { get; set; }
    public DateTime Geburtstag { get; set; }
}

public class DB_Abfrage
{
     public static List<Person> GetPersonen()
        {
            try
            {
                using (entities1 ctx = new entities1())
                {
                    var query = (from p in ctx.tblperson
                                orderby p.name
                                select new Person
								{
									Id = p.id,
									Vorname = p.vorname,
									Name = p.name,
									Geburtstag = p.geburtstag
								};

                    return query.ToList();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Fehler: GetPersonen");
                return null;
            }
        }
}






BindingSource bs = new BindingSource();
Person p = new Person();

private void Form1_Load(object sender, EventArgs e)
{
	bs.DataSource = typeof(Person);

	List<Person> list = DB_Abfrage.GetPersonen();
	foreach (Person p in list)
	{
		bs.Add(p);
    }

	dataGridView1.DataSource = bs;
	dataGridView1.AutoGenerateColumns = true; 
	
	tbVorname.DataBindings.Add("Text", bs, "Vorname");
	tbName.DataBindings.Add("Text", bs, "Name");
	tbGeburtstag.DataBindings.Add("Text", bs, "Geburtstag");
}


private void btnNeuePerson_Click(object sender, EventArgs e)
{
     // hier sollen nun die Textboxen geleert werden.
    // muss dazu das Binding gelöst werden?
    // wie?
}

private void btnSpeichern_Click(object sender, EventArgs e)
{
	p = new Person();
	p.Vorname = tbVorname.Text; 
	p.Name = tbName.Text;
	p.Geburtstag = tbGeburtstag.Text;
        
	
    bs.Add(p);
    bs.EndEdit();
	// neuer Datensatz wird zwar angezeigt, jedoch nicht gespeichert
	// muss ich dazu dann eine extra Insert Methode schreiben und aufrufen?
}


Ich danke Euch!

07.12.2016 - 09:45 Uhr

Leider verstehe ich das mit dem DataBinding noch nicht wirklich. 😦
Ich habe es mal an einem einfachen Beispiel versucht, indem ich eine Klasse Person erstelle und nun den Namen an die TextBox binde.


textBox1.DataBindings.Add("Text", p, "Name", true, DataSourceUpdateMode.OnPropertyChanged);

Es klappt zumindest, dass ich nun Werte ändern kann.
Aber zum Löschen meiner jeweiligen TextBox müsste ich dann doch immer noch

this.textBox1.DataBindings.Clear();

für jede TextBox schreiben?

06.12.2016 - 20:48 Uhr

Danke chilic für deine Anmerkungen.
Hab es nun wie folgt gelöst


  void TextboxLeeren(List<TextBox> lstTextbox)
        {
            foreach (TextBox textBox in lstTextbox)
            {
                textBox.Text = "";
            }
        }

06.12.2016 - 20:39 Uhr

Ich bin zufällig über diesen alten Beitrag gestolpert, da ich das selbe Problem hatte.
Kann man es nicht auch einfach so lösen, bzw. so funktioniert es bei mir.



    // Eingabe in Rechnungsmenge auf Zahlen beschränken.
    private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
        string headerText = dataGridView1.Columns[e.ColumnIndex].HeaderText;

        // Abbruch der Validierung, wenn die Zelle nicht in der Spalte Menge ist.
        if (!headerText.Equals("Menge")) return;

        DataGridViewColumn col = this.dataGridView1.Columns[e.ColumnIndex];
        DataGridViewCell cell = this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];

        double y;
        if (double.TryParse(cell.Value.ToString(), out y))
        {
            MessageBox.Show("Bitte nur Zahlenwerte eintragen", "Falsches Eingabeformat", MessageBoxButtons.OK, MessageBoxIcon.Error);
            dataGridView1.EditingControl.Text = "0";
        }
    }

02.12.2016 - 08:59 Uhr

Ok, ich habe mich vielleicht zu Beginn nicht klar ausgedrückt.
Die Textboxen sollen nach verschiedenen Nutzeraktionen geleert werden.
Verstehe ich es also richtig, dass es dann am besten wäre das Leeren in eine Methode zu legen und diese immer wieder aufzurufen?


void TextBoxenLeeren()
{
   tbName.Text = "";
   tbVorname.Text = "";
   // ...
}


private void btnSpeichern_Click(object sender, EventArgs e)
{
    // ...
    TextBoxenLeeren();
}

01.12.2016 - 21:59 Uhr

Okay - aber wie kann ich es dann lösen, dass nur bestimmte Textboxen angesprochen werden??

01.12.2016 - 20:53 Uhr

Da nicht alle Textboxen geleert werden sollen, habe ich eben die entsprechenden in die Liste gepackt?

01.12.2016 - 20:30 Uhr

Hallo,

in meiner WinForms Anwendung habe ich relative viele Controls, u.a. auch einige TextBoxen.
Nun möchte ich versuchen, diese möglichst gut (=sauberer Code) zu leeren bzw. auf null zu prüfen.

Ich habe unten mal Code angehängt, wie ich es mir etwa vorstelle. Vielleicht könnt ihr mir helfen und sagen, ob dies so "richtig" ist? Danke!


// Zunächst eine List anlegen und die TextBoxen anhängen.
List<TextBox> lstTextBox = new List<TextBox>();
lstTextBox.Add(tbName);
lstTextBox.Add(tbVorname);
lstTextBox.Add(tbStrasse);
// ...



// Prüfen, ob TextBoxen ausgefüllt ist.
foreach (var control in lstTextBox)
{
    var textBox = control as TextBox;
    if (textBox != null && string.IsNullOrEmpty(textBox.Text))
    {
        MessageBox.Show("Bitte füllen Sie alle Felder aus!");
        return;
    }
}

// Textboxen leeren.
//  Hier noch die zusätzliche Frage, ob ich dies auch für andere Controls wie Comboboxen //verwenden kann?
foreach (var control in lstTextBox)
{
       var textBox = control as TextBox;
	textBox.Text = "";
}