Autor Beitrag
nav93
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Mo 05.12.16 09:54 
hey leute,

hab eine frage bezüglich dem Pdf erstellen , in dem eine ausgewählte reihe vom datagridview in der pdf übergeben wird.
ich hab es versucht aber es werden immer alle übergeben nicht nur die die ausgewählt wurde .

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
private void dataGridView1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
           
                Document doc = new Document(iTextSharp.text.PageSize.LETTER, 10104235);
            PdfWriter wri = PdfWriter.GetInstance(doc, new FileStream(@"C:\Users\navee\Desktop\Leihvertrag.pdf", FileMode.Create, FileAccess.ReadWrite));
            doc.Open();

            iTextSharp.text.Image Diamant = iTextSharp.text.Image.GetInstance(@"C:\Users\navee\Desktop\DiamantPDF.PNG");
            Diamant.ScalePercent(72f);
            doc.Add(Diamant);
            Paragraph paragraph = new Paragraph("            \n ________________________________________________________________________________________         \n                                                                      PFANDLEIHHAUS WVB \n                                                                               - Leihvertrag - \n ________________________________________________________________________________________ \n \n \n");
            Paragraph anschrift = new Paragraph("        WVB\n        def \n        11111 abc\n        Tel.0000/0000");
            Paragraph leerzeichen = new Paragraph("\n \n \n \n \n \n \n \n \n               _______________________                                                     _______________________");
            Paragraph unterschrift = new Paragraph("                      Unterschrift Pfänder                                                                     Unterschrift Kunde ");
            
            Paragraph agbs = new Paragraph("\n \n \n AGB: Der Vertrag ist nicht Widerrufbar ! \n \n Leihgebühr : 1 Monat = 5 €\n                      2 Monate = 10 € \n                      3 Monate  = 15 €");
           
             PdfPTable table = new PdfPTable(dataGridView1.Columns.Count);

            foreach (DataGridViewRow row in dataGridView1.SelectedRows)
            {

                for (int j = 0; j < dataGridView1.Columns.Count; j++)
                {
                    table.AddCell(new Phrase(dataGridView1.Columns[j].HeaderText));
                }

                table.HeaderRows = 1;

                for (int i = 0; i < dataGridView1.Rows.Count; i++)
                {
                    for (int k = 0; k < dataGridView1.Columns.Count; k++)
                    {
                        if (dataGridView1[k,i].Value != null)
                        {
                            table.AddCell(new Phrase(dataGridView1[k, i].Value.ToString()));
                        } 
                    }
             }
                doc.Add(anschrift);
                doc.Add(paragraph);
                doc.Add(table);
                doc.Add(leerzeichen);
                doc.Add(unterschrift);
                doc.Add(agbs);
                

                doc.Close();
                System.Diagnostics.Process.Start(@"C:\Users\navee\Desktop\Leihvertrag.pdf");


hoffe jemand findet den fehler
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 05.12.16 11:24 
In deiner Schleife über SelectedRows iterierst du dann zum hinzufügen über alle Rows. In Summe bekommst du also SelectedRows * Rows Anzahl Zeilen.
Die Lösung ist so offensichtlich das ich dich mal selber raten lasse.
nav93 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Mo 05.12.16 11:57 
Danke für deine antwort erst mal.

ohman könntest du mir das echt sagen bitte. ich würde das gern verstehen & verbessern :D
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 05.12.16 12:07 
- Nachträglich durch die Entwickler-Ecke gelöscht -
nav93 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Mo 05.12.16 12:12 
könntest du mir sagen wie ich das ändern kann ? also wo genau . ich komm echt nicht drauf. wäre echt wichtig :(
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 05.12.16 12:21 
Wir helfen dir gern das selbst zu lösen.
Du iterierst über Rows willst aber nur die SelectedRows. Vermutlich sogar nur eine davon. Wenn du also nur die SelectedRows willst aber nicht alle Rows was musst du tun? Bzw . was must du nicht tun was du gerade tust?
nav93 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Mo 05.12.16 12:28 
ich denke die schleifen entfernen aber wenn ich die entferne fehlt mir unten dann die deklaration der variablen . ich bräucht wirklich genauere hilfe . ich sitz da seit 3 stunden drann ....


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
for (int i = 0; i < dataGridView1.SelectedRows.Count; i++)
                {
                    for (int k = 0; k < dataGridView1.Columns.Count; k++)
                    {
                        if (dataGridView1[k, i].Value != null)
                        {
                            table.AddCell(new Phrase(dataGridView1[k, i].Value.ToString()));
                        }
                    }


wenn ich das änder wird mir immer eins angezeigt aber dann nicht das andere. bin der lösung nah
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 05.12.16 12:54 
Zitat:
wenn ich das änder wird mir immer eins angezeigt aber dann nicht das andere.


Häh. Willst du jetzt eins oder mehrere?

Zitat:
ausblenden C#-Quelltext
1:
if (dataGridView1[k, i].Value != null)					


i ist der Index in der Menge SelectedRows du greifst aber per dataGridView1[k, i] wieder auf alle Rows zu. Du mußt dir die Daten schon aus der aktuellen SelectedRow ziehen.
nav93 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Mo 05.12.16 13:11 
Ich möchte eins . Also immer nur das ausgewählte . Das was ich per mouse click auswähle.
ausblenden C#-Quelltext
1:
if (dataGridView1[k, i].Value != null					


Also muss ich hier was ändern ? Kann mir das denn keiner sagen :o ich komme da echt nicht drauf . Ist echt nicht so mein Gebiet .. also muss ich statt i etwas anderes hinschreiben ? Sollt ich die Schleife mit i++ weg machen ? Quasi das er nicht zählt sondern nur eins nimmt ? Was müsste denn da anders sein

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 05.12.16 13:39 
Anstatt dataGridView1[k, i] solltest du dataGridView1.SelectedRows[i][k] oder ähnliches verwenden. Aka nimm die i.te SelectedRow und gib mir die k.te Spalte.

Zitat:
ausblenden C#-Quelltext
1:
if (dataGridView1[k, i].Value != null)					


Das ist aus anderen Gründen prinzipiell problematisch. Ja da solltest du auch auf SelectedRows prüfen aber wenn die Zelle null enthält nichts tun ist vermutlich Unsinn.
Wenn du einfach keine Zelle hinzufügst bei null hast du nachher weniger Zellen als Spalten in einer Row. Und ich vermute schwer das die Zellen dann linksbündig ausgerichtet werden. Ist z.b. bei 10 Spalten die erste null bekommst du nur 9 nach links aufgerückte Zellen die alle unter der falschen Spaltenüberschrift stehen und der letzten Spalte fehlt eine Zelle.

Du solltest im Falle null auch eine Zelle hinzufügen z.B. mit einem Leerstring als Inhalt.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 05.12.16 13:46 
Hallo nav93,

wenn du nur die Zeile haben willst, welche du gerade per Maus doppelgeklickt hast, dann verwende das Ereignis DataGridView.CellDoubleClick und werte die EventArgs aus.

PS: Ein bißchen mehr Eigeninitiative wird hier im Forum erwartet - beim nächsten Mal werde ich deine Beiträge demnächst temporär sperren (wenn du wieder nur herum bettelst).

Und verwende demnächst beim Code in deinen Beiträgen die passenden C# (bzw. generell Code) - Tags.
nav93 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Mo 05.12.16 13:55 
hä ich bettel doch gar nicht ? ich möchte es doch verstehen :/ bloß fällt mir das einfach schwer .. naja sorry . ich probier es weiter . ich denke wenn ich das i durch das row ersetze wird doch nur row angeschaut oder?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 05.12.16 14:24 
Du kannst dir deine Daten direkt aus dem row Objekt holen ja. Aber i durch Row ersetzen klingt falsch. row[Spaltenindex] geht.
nav93 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Mo 05.12.16 15:27 
leider versteh ich nicht was du damit meinst . soll ich das so ändern :

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
foreach (DataGridViewRow row in dataGridView1.SelectedRows)
            {

                for (int j = 0; j < dataGridView1.Columns.Count; j++)
                {
                    table.AddCell(new Phrase(dataGridView1.Columns[j].HeaderText));
                }

                table.HeaderRows = 1;

                for (int i = 0; i < dataGridView1.Rows.[i]) // hier das i rein ?
                {
                    for (int k = 0; k < dataGridView1.Columns.Count; k++)
                    {
                        if (dataGridView1[k, i].Value != null)
                        {
                            table.AddCell(new Phrase(dataGridView1[k, i].Value.ToString()));
                        }
                    }
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 05.12.16 15:47 
Zitat:
// hier das i rein ?


Nein. Warum glaubst du das müßte dahin? Was glaubst du würde das i da tun?
nav93 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Mo 05.12.16 15:52 
ich dachte das dann i quasi beim ersten mal aufhört weil meine selected rows ja nur eins ist . also ein Row
dann dachte ich das es dann aufhört. Falscher ansatz? wie ist das gemeint mit .row[index]?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 05.12.16 16:47 
Zitat:
wie ist das gemeint mit .row[index]?

Zitat:
ausblenden C#-Quelltext
1:
foreach (DataGridViewRow row in dataGridView1.SelectedRows)					

row ist dein DataGridViewRow object (hast du so benannt nicht ich) und [] sind die Arrayzugriffsoperatoren. row[Spaltenindex] bedeutet also du sollst einfach nur die Spalteninformation aus dem DataGridViewRow Object holen das du schon in den Fingern hast. Du gehst später hin und iterierst nochmal mit for (int i = 0; i < dataGridView1.Rows.Count; i++) über alle Zeilen des Grids. Das zu ändern ist sinnfrei weil die Zeile einfach völlig, komplett, absolut überflüssig ist und einfach weg kann. Alle Daten die du willst sind schon in der row die du mit der ersten foreach geholt hast du mußt die einfach nur auslesen und in deine PdfPTable packen.
nav93 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Mo 05.12.16 18:25 
okay , ich glaub das hab ich verstaden, dass mit dem weg lassen. hört sich logisch an . aber wenn ich das weg mache habe ich doch in der klammer keinen wert mehr für i

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
 foreach (DataGridViewRow row in dataGridView1.SelectedRows)
                {

                    for (int j = 0; j < dataGridView1.Columns.Count; j++)
                    {
                        table.AddCell(new Phrase(dataGridView1.Columns[j].HeaderText));
                    }

                    table.HeaderRows = -1;

                    
                    
                        for (int k = 0; k < dataGridView1.Columns.Count; k++)
                        {
                            if (dataGridView1[k, i].Value != null// hier hab ich ja kein wert mehr für i . muss ich da nicht etwas mit row einbinden
                            {
                                table.AddCell(new Phrase(dataGridView1.RowCount.ToString()));
                            }
                        }
                    }


Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 05.12.16 18:44 
Um dies abzukürzen:
ausblenden C#-Quelltext
1:
if (row.Cells[k].Value != null// geändert (s. den Kommentar von Ralf weiter unten)					


Offen ist aber immer noch die Frage, ob du alle SelectedRows ausgeben möchtest oder nur die aktuelle Zeile (dann nimm das von mir oben vorgeschlagene Ereignis)?

Und noch ein Tipp: du solltest das Erzeugen des PDFs in eine eigene Klasse auslagern (und nicht in der Forms-Klasse) - Stichwörter: Trennung von UI und Logik, Wiederverwendbarkeit etc.


Zuletzt bearbeitet von Th69 am Mo 05.12.16 19:51, insgesamt 1-mal bearbeitet
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 05.12.16 18:56 
- Nachträglich durch die Entwickler-Ecke gelöscht -