Povolení NULL   zodpovězená otázka

VB.NET, WinForms

Dobrý den, v mojí aplikaci mám výstup z datagridviewu do dokumentu MS Word. Problém nastane, když mám prázdné pole v datagridviewu a import tabulky do dokumentu nenastane.

Neporadil by mi prosím někdo, jak nastavím datagridview, aby povoloval prázdné pole.

Děkuji za odpověď

nahlásit spamnahlásit spam 0 odpovědětodpovědět

DataGridView přece povoluje nevyplněnou buňku, ne?

Máte problém v tom, co obecně "prázdná" buňka obsahuje? Ppodle formátu třeba 0 (Numeric) nebo "" (String) - myslím, že to je v DataGridView defaultní nastavení... Jistě musíte v nastavení vyhovět zdroji dat...

Vy chcete, aby v "prázdném poli" byla hodnota null? Nejsem moc znalý, pokud ale neporadí někdo, kdo umí, pak můžete zkusit:

    DataGridView1.DefaultCellStyle.NullValue = vbNull

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Je to formátu string

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vlákno jste nazval "Povolení NULL". Chcete-li prázdnou hodnotu ve string, pak je to: "" a pokud jste neměnil výchozé nastavení, je DataGridView1.DefaultCellStyle.NullValue = "" {String}

Ale jistě jde i v kódu nastavit

  DataGridView1.DefaultCellStyle.NullValue = ""

Není problém spíš v tom, jak předáváte data do Wordu než v nastavení DataGridView?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Po nastavení

  DataGridView1.DefaultCellStyle.NullValue = vbNullString

je NullValue Nothing

Po nastavení

  DataGridView1.DefaultCellStyle.NullValue = vbNullChar

je NullValue String, ale " " - tedy mezera

Co očekává Word?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Data do wordu předávám takto:

 Me.Enabled = False
           
            Dim w As New Microsoft.Office.Interop.Word.Application()
            'otevřít dokument
            w.Documents.Open(IO.Path.Combine(Application.StartupPath, "Vypis_Sablona.doc")).Activate()

                'vygenerovat položky z datagridview do tabulky v dokumentu
                Dim suma As Double = 0
                For i As Integer = 0 To Form1.DataGridView1.Rows.Count - 2
                    With w.ActiveDocument.Tables(1).Rows.Add()               
                                          'vyplnit hodnoty buněk 
                        .Cells(1).Range.Text = Form1.DataGridView1.Rows(i).Cells(0).Value
                        .Cells(2).Range.Text = Form1.DataGridView1.Rows(i).Cells(1).Value
                        .Cells(3).Range.Text = Form1.DataGridView1.Rows(i).Cells(2).Value
                        .Cells(4).Range.Text = Form1.DataGridView1.Rows(i).Cells(3).Value
                        .Cells(5).Range.Text = Form1.DataGridView1.Rows(i).Cells(4).Value

                     

    End With
Next

Přesné znění chybové hlášky: "Conversion from type 'DBNull' to type 'String' is not valid."

Zkoušel jsem nastavit vlastnost DefaultCellStyle.NullValue, podle vašich rad, ale problém pořád přetrvává.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Kde se v DataGridView bere DBNul - zřejmě při plnění daty. Nastavení před plněním tomu nezabrání a po naplnění obsah buňky nezmění. Je to spíš cesta k vyvolání chyb. Zkusil bych tedy DBNul v buňkách přepsat na "" a teprve pak plnit do Wordu - příklad

   If IsDBNull(Form1.DataGridView1.Rows(i).Cells(0).Value) Then _
      Form1.DataGridView1.Rows(i).Cells(0).Value = ""

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Řídil jsem se podle vaší rady:

 Me.Enabled = False
           
            Dim w As New Microsoft.Office.Interop.Word.Application()
            'otevřít dokument
            w.Documents.Open(IO.Path.Combine(Application.StartupPath, "Vypis_Sablona.doc")).Activate()

                'vygenerovat položky z datagridview do tabulky v dokumentu
                Dim suma As Double = 0
                For i As Integer = 0 To Form1.DataGridView1.Rows.Count - 2
                    With w.ActiveDocument.Tables(1).Rows.Add() 
 'pokud jsou hodnoty v buňkách rovny DBNULL, přepsat je na ""
                        If IsDBNull(Form1.PříjmyDataGridView.Rows(i).Cells(0).Value) Then
                            Form1.PříjmyDataGridView.Rows(i).Cells(0).Value = ""
                        ElseIf IsDBNull(Form1.PříjmyDataGridView.Rows(i).Cells(1).Value) Then
                            Form1.PříjmyDataGridView.Rows(i).Cells(1).Value = ""
                        ElseIf IsDBNull(Form1.DataGridView1.Rows(i).Cells(2).Value) Then
                            Form1.DataGridView1.Rows(i).Cells(2).Value = ""
                        ElseIf IsDBNull(Form1.PříjmyDataGridView.Rows(i).Cells(3).Value) Then
                            Form1.DataGridView1.Rows(i).Cells(3).Value = ""
                        ElseIf IsDBNull(Form1.DataGridView1.Rows(i).Cells(4).Value) Then
                            Form1.DataGridView1.Rows(i).Cells(4).Value = ""
                        End If              
                                          'vyplnit hodnoty buněk 
                        .Cells(1).Range.Text = Form1.DataGridView1.Rows(i).Cells(0).Value
                        .Cells(2).Range.Text = Form1.DataGridView1.Rows(i).Cells(1).Value
                        .Cells(3).Range.Text = Form1.DataGridView1.Rows(i).Cells(2).Value
                        .Cells(4).Range.Text = Form1.DataGridView1.Rows(i).Cells(3).Value
                        .Cells(5).Range.Text = Form1.DataGridView1.Rows(i).Cells(4).Value

                    

    End With
Next
 

Ale pořád to nefunguje. Pořád to hází hlášku "Convention from type DBNull to type String is not valid.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Chyba může být v použití v ElseIf. Pokud je v řádku více buněk s DBNull, pak se změní jen první v pořadí. Po ElseIf s pravdivou podmínkou totiž následuje jen Else nebo End If, žádné další ElseIf se po splněné podmínce již nevyhodnocuje!

Kdyby nešel změnit zdroj (nakonec je to i zbytečné), použijte pro každou buňku podmínku tak, že pokud není IsDBNull, naplníte buňku Wordu hodnotou z DataGridWiev, jinak s "" (popř. tím, co Word očekává).

  For i As Integer = 0 To Form1.DataGridView1.Rows.Count - 2
      With w.ActiveDocument.Tables(1).Rows.Add() 
          If  Not IsDBNull(Form1.PříjmyDataGridView.Rows(i).Cells(0).Value) Then
              .Cells(1).Range.Text = Form1.DataGridView1.Rows(i).Cells(0).Value
          else   
              .Cells(1).Range.Text = ""
          End If              
          ' a obdobně pro všechny další buňky v řádku...
          '...
      End With
  Next

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback