Vypsání popisu hodnoty z ComboBoxu do Labelu   otázka

VB.NET

Dobrý den.

Řeším takový problém.

Potřebuji si z TXT souboru načíst do ComboBoxu při startu programu celý jeho obsah - Seznam.txt - a z dalšího TXT souboru si načíst jeho obsah - Popis.txt - do Labelu, aby se mi ale měnil text v Labelu v závislosti na okamžité hodnotě v ComboBoxu a nevím, jak tohle vyřešit. :-(

Jsem naprostý začátečník ve VB.Netu a proto budu moc rád za vaše rady, tipy.

Díky.

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

Musíte si to promyslet...

Jak jsou data vzájemně provázána? Objem dat? Formát souboru, oddělovač, csv soubor ?

Bude-li se pouze číst nebo i editovat, přidávat a mazat záznamy...

Bude-li seznam k popisu ve vztahu 1:1, třeba by mohlo být v jednom souboru (třeba dva sloupce)?

Máte na výběr z vícero možností, jak soubor číst, celé najednou a rozdělit řádky pomocí split,

číst po řádcích a lze také použít oledb provider a načíst jako tabulku...

Pomocí událostí vámi vybraných prvků ve formuláři si načtená data zobrazíte dle vlastní potřeby.

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

Jsou dva soubory v TXT, které mají vztažné hodnoty řazené po řádcích.

Jeden TXT soubor chci načíst do LaBeLu a druhý TXT soubor chci načíst do ComboBoxu a vždy, když si vyberu v CoMboBoxu nějakou hodnotu, aby se mi vedle v LaBeLu objevil jeho popis.

Ani jeden TXT soubor se nebude dodatečně editovat, prostě budu mít 2 hotové TXT soubory, které budou jako zdroj a u kterých potřebuji vyřešit také to, aby se mi automaticky načetly při spuštění programu.

Oba budou mít cca 100 řádků.

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

Pro začátek trochu čtení:

https://docs.microsoft.com/cs-cz/dotnet/...

Musí být soubory dva? Nestačil by jen jeden?

První řádek jako záhlaví a pod ním položky, odddělit středníkem :

Název;Popis
Položka1;Popis1
Položka2;Popis2
Položka3;Popis3
Položka4;Popis4

Případně přidat index řádku:

Číslo;Název;Popis
1;Položka1;Popis1
2;Položka2;Popis2
3;Položka3;Popis3
4;Položka4;Popis4

Mohl byste soubor načíst do DataTable a nastavit u comboboxu DisplayMember,ValueMember a DataSource případně lze zobrazit celou tabulku v datagridview nastavením DataSource na vaši DataTable...

http://www.vbforums.com/showthread.php?7...

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

Pokud se inspirujete dle uvedeného linku v závěru předchozího příspěvku.

Vzorek obsahu souboru Seznam.txt :

Číslo;Název;Popis
1;Položka1;Popis1
2;Položka2;Popis2
3;Položka3;Popis3
4;Položka4;Popis4

Formulář Form1 obsahuje DataGridView1, ComboBox1 a Label1 :

Public Class Form1
    Dim file_name As String = "C:\Seznam.txt" 'opravte si
    Public Sub New()
        ' This call is required by the designer.
        InitializeComponent()
        ' Add any initialization after the InitializeComponent() call.
        Dim dt As DataTable = TextToTable(file_name, ";", True)
        DataGridView1.DataSource = dt
        With ComboBox1
            .DisplayMember = "Název"
            .ValueMember = "Číslo"
            .DataSource = New DataView(dt)
        End With
        With Label1
            .DataBindings.Add("text", ComboBox1.DataSource, "Popis")
        End With
    End Sub

    Private Function TextToTable(ByVal path As String, ByVal delimitter As Char, ByVal header As Boolean) As DataTable
        Dim source As String = String.Empty
        Dim dt As DataTable = New DataTable

        If IO.File.Exists(path) Then
            source = IO.File.ReadAllText(path, System.Text.Encoding.GetEncoding("windows-1250"))
        Else
            Throw New IO.FileNotFoundException("Could not find the file at " & path, path)
        End If

        Dim rows() As String = source.Split({Environment.NewLine}, StringSplitOptions.None)

        For i As Integer = 0 To rows(0).Split(delimitter).Length - 1
            Dim column As String = rows(0).Split(delimitter)(i)
            dt.Columns.Add(If(header, column, "column" & i + 1))
        Next

        For i As Integer = If(header, 1, 0) To rows.Length - 1
            Dim dr As DataRow = dt.NewRow

            For x As Integer = 0 To rows(i).Split(delimitter).Length - 1
                If x <= dt.Columns.Count - 1 Then
                    dr(x) = rows(i).Split(delimitter)(x)
                Else
                    Throw New Exception("The number of columns on row " & i + If(header, 0, 1) & " is greater than the amount of columns in the " & If(header, "header.", "first row."))
                End If
            Next

            dt.Rows.Add(dr)
        Next

        Return dt
    End Function
End Class

Vůbec to nevypadá složitě, že? Mohlo by to takhle nějak posloužit vašemu záměru?

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

Díky moc za kod, vypadá docela dobře a ne moc složitě, ale s připojováním DataBází mám problém; ještě nikdy jsem to nedělal, takže DataGridView nevím, jak mám zpracovat a kam ho umístit. :-(

Ještě nikde nevidím cestu k Popisu do LaBeLu. :-(

Fakt se to teprve učím, takže budu moc rád za jakékoli vysvětlení a další rady. :-)

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

DataGridView naleznete obdobně jako Combobox, pokud máte toolbox po kategoriích, tak musíte pohledat v kategoriích nebo přepnout zobrazení na vše a budou vidět všechny prvky dle abecedy.

Pokud datagridview nechcete, tak ho do formuláře vůbec nedávejte a odstraňte tento řádek:

DataGridView1.DataSource = dt

Vytvořte textový soubor, aby obsahoval řádky s hodnotami oddělenými středníky jako vzorek a opravte k němu cestu. První řádek souboru obsahuje záhlaví, pokud ho změníte, tak bude patřičně opravit i názvy v kódu, na první pokus nechat vzorek jak je a pak už budete vědět. V comboboxu se mají zobrazit názvy a v labelu popisy dle zadání s malým rozdílem proti zadání, neboť soubor nejen z důvodu úspor je jen jeden, v případě nutnosti upravte dle vlastní potřeby, zdar dílu.

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

Díky moc za kod. :-)

Chodí to parádně.

Jen se chci zeptat, jestli lze nastavit nějaká relativní/dynamická cesta k názvu zdrojového souboru místo té absolutní.

Jde mi o to, že ne každý si to bude spouštět ze stejného místa jako já a chci nějak ošetřit, aby si to bralo ze stejné složky, kde je EXE soubor a ze stejné podsložky Files.

Aby to nebylo takto: Dim file_name As String = "C:\Seznam.txt" , ale např. takto: Dim file_name As String = "..\Files\Seznam.txt" či jinak.

Ten můj navrhovaný způsob nechodí, ani i když ty dvě tečky odstraním. :-(

Díky moc ještě jednou za radu.

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

Jaká je vaše představa, kde soubor uložit? Lokální data aplikací uživatele? Všichni uživatelé?

Můžete použít dialog pro získání cesty k souboru, případně jen pokud soubor nenaleznete ve výchozím umístění.

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

Už jsem na to přišel. :-)

Stačilo mi dát jen:

Dim VarCestaSouboru As String = "\Files\Seznam-Popis.csv"
nebo
Dim VarDavka As New IO.StreamReader("\Files\Davka.txt", System.Text.Encoding.GetEncoding("windows-1250"))

kde EXE soubor musí být ve stejné složce jako podsložka Files, pak už to chodí.

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

Zdá se, že vlákna spolu souvisí a má-li combobox zobrazit pouze prvních deset položek:

With ComboBox1
    .DisplayMember = "Název"
    .ValueMember = "Číslo"
    'přidejte referenci System.Data.DataSetExtensions
    .DataSource = dt.AsEnumerable.Take(10).CopyToDataTable
End With
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ta vlákna souvisí spolu jen tím, že jsou oba problémy řeším v jednom programu. :-)

… ale v obou se jedná o jiný ComboBox.

Přesto i tak ti děkuji za nasměrování a tvůj způsob řešení velmi rád vyzkouším a dám vědět.

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

Omlouvám se za zvědavost, můžete naznačit, jaký je vlastně cíl?

Jak mají ty soubory seznam, dávka, log a příkazy spolupracovat?

Podívejte se na DataSet, obsahuje několik tabulek, lze je provázat, třeba by to pomohlo věci.

A místo csv použít xml, je tam možnost ReadXml a WriteXml, lze uložit tabulku a zase načíst,

můžete se inspirovat se nějakým příkladem, hledat na webu.

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