Výběr položky v Listboxu pomocí daných kláves   zodpovězená otázka

VB.NET

Dobrý večer, používám VB .NET 2005 Express. Ve formuláři mám dva ListBoxy obsahující seznamy nějakých položek. První ListBox mi pro výběr položky implicitně nabízí šipky nahoru a dolu. Potřeboval bych, aby u druhého Listboxu mohl vybírat položky s využitím jiných dvou kláves(např. šipky doleva a doprava).

Vím, že jde o trapný dotaz, proto trpělivost se začátečníkem:-)

Děkuji Martin Voráč

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

Dobrý den,

kontrolujte událost KeyDown u prvního listboxu. Ta se zavolá při stisknutí tlačítka.

Tady je ukázkový kód jak pak rozlišovat klávesy a jak posunovat v druhém listboxu:

    Private Sub ListBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles ListBox1.KeyDown
        If e.KeyCode = Keys.X Then ' pohyb dolu
            If ListBox2.SelectedIndex < ListBox2.Items.Count - 1 Then _
                ListBox2.SelectedIndex += 1
        ElseIf e.KeyCode = Keys.S Then ' pohyb nahoru
            If ListBox2.SelectedIndex > 0 Then _
                ListBox2.SelectedIndex -= 1
        End If
    End Sub
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji za odpověd, v mnohém mi to pomohlo. Přesto jen, pokud bych chtěl ovládat posun mezi prvky v ListBoxu1 jen šipkou nahoru a dolů a v Listboxu2 šipkou doprava a doleva, tak narážím na problém, kdy při stisknutí kláves doleva nebo doprava dává přednost také implicitnímu nastavení a pohybuji se v obou listboxech. Podobně i pro Vámi použité klávesy R a S skočí v Listboxu1 na položku začínající písmenem R nebo S. Dají se tyhle výchozí nastavení kláves nějak šikovně deaktivovat?

Děkuji Voráč

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

Ideální by asi bylo vložit tento kód do úplně jiného prvku na kterým bude focus (prvek bude vybrán) a rozšířit ho o ovládání obou ListBoxů.

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

...pokouším se řídit Vaší radou, jen trochu konkrétněji. Jaký prvek by byl podle Vás vhodný. Ne každý má událost KeyDown. Zkusil jsem např. button...jen nevím jak nastavit tu vlastnost focus. Velký dík za trpělivost:)

M.V.

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

Tak ten kód přidejte do událostí přímo formuláře (i ten má KeyPress). A pak zapište ještě tento kód, který zajistí, že při vybrání jednoho ze dvou ListBoxů se předá focus právě na formulář a nebudou tak přijímat klávesové zkratky jiné než v KeyPress ve formuláři:

    Private Sub OdeberFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.GotFocus, ListBox2.GotFocus
        Me.Focus()
    End Sub
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vím, že už ze mě musíte šedivět, ale stále se mi nedaří dospět cíle. Vytvořil jsem si nový formulář k pořešení tohoto problému, ale nemůžu se hnout z místa. Snažil jsem se zapsat kod dle Vašich pokynů, tak prosím kde dělám chybu??? Děkuji Voráč

Public Class Form1
    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown

        If e.KeyCode = Keys.Down Then ' pohyb dolu
            If ListBox1.SelectedIndex < ListBox1.Items.Count - 1 Then _
                ListBox1.SelectedIndex += 1
        ElseIf e.KeyCode = Keys.Up Then ' pohyb nahoru
            If ListBox1.SelectedIndex > 0 Then _
                ListBox1.SelectedIndex -= 1
        End If

        If e.KeyCode = Keys.Right Then ' pohyb dolu
            If ListBox2.SelectedIndex < ListBox2.Items.Count - 1 Then _
                ListBox2.SelectedIndex += 1
        ElseIf e.KeyCode = Keys.Left Then ' pohyb nahoru
            If ListBox2.SelectedIndex > 0 Then _
                ListBox2.SelectedIndex -= 1
        End If

    End Sub

    Private Sub OdeberFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.GotFocus, ListBox2.GotFocus
        Me.Focus()
    End Sub
End Class

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

Normální funkce je přehazovat se mezi listboxy tabulátorem a ovládat pohyb mezi položkami šipkami nahoru a dolu... Proč to nevyhovuje?

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

Na formuláři nastavte Me.KeyPreview = True a subrutinu OdeberFocus zrušte!

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

Mám speciální "klávesnici", kde je pouze 8 tlačítek a potřebuji vytvořit jednoduchou aplikaci, která bude těmito tlačítky ovládána. ..tedy dané tláčítka zastupují v podstatě vybrané klávesy na standartní klávesnici. Mezi ně patří právě i kurzorové šipky:(

Pokud nastavím Me.KeyPreview = True, tak mi to přesto stále nefunguje...šipky doleva a doprava posouvají výběr v obou seznamech:(

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

Zkusil jsem kód trochu otočit - fokus neodebírat, ale přidělovat, když zaměření na formulář nedovede "vypnout" vliv šipek na listbox. Nevím, jak vaše speciální klávesnice, vyházím z faktu, že fungují šipky vlevo jako nahoru a vpravo jako dolu.

  Public Class Form1
    Private Sub Form1_KeyDown(ByVal sender As Object, _
          ByVal e As System.Windows.Forms.KeyEventArgs) _
          Handles Me.KeyDown
      If e.KeyCode = Keys.Down Or e.KeyCode = Keys.Up Then
        ListBox1.Focus()
      End If
      If e.KeyCode = Keys.Left Or e.KeyCode = Keys.Right Then
        ListBox2.Focus()
      End If
    End Sub
  End Class

Zůstal však problém, že první změna "směru kláves" (z nahoru/dolu do vlevo/vpravo a naopak) posune o jeden řádek listbox se zaměřením, teprve potom to funguje.

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

Tak jsem zkusil nechtěný nezvládnutý posun vracet. Je to trochu obludné, navíc se mi nechtělo ošetřovat krajní polohy, tak jsem použil Try. Ale funguje to.

  Public Class Form1
    Private Sub Form1_KeyDown(ByVal sender As Object, _
          ByVal e As System.Windows.Forms.KeyEventArgs) _
          Handles Me.KeyDown
      Try
        If ListBox1.Focused Then
          If e.KeyCode = Keys.Left Then
            ListBox1.SelectedIndex += 1
            ListBox2.SelectedIndex -= 1
          End If
          If e.KeyCode = Keys.Right Then
            ListBox1.SelectedIndex -= 1
            ListBox2.SelectedIndex += 1
          End If
        End If
        If ListBox2.Focused Then
          If e.KeyCode = Keys.Up Then
            ListBox2.SelectedIndex += 1
            ListBox1.SelectedIndex -= 1
          End If
          If e.KeyCode = Keys.Down Then
            ListBox2.SelectedIndex -= 1
            ListBox1.SelectedIndex += 1
          End If
        End If
      Catch
      End Try
  
      If e.KeyCode = Keys.Down Or e.KeyCode = Keys.Up Then
        ListBox1.Focus()
      End If
      If e.KeyCode = Keys.Left Or e.KeyCode = Keys.Right Then
        ListBox2.Focus()
      End If
    End Sub
  End Class

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

Perfektní...už se mi bude líp spávat. Děkuji za tenhle vánoční dárek. Krásné svátky nejen Vám, ale i všem ostatním z vbnet.cz:)

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

Děkuji za přání, užívejte též svátky v pohodě!

Zjistil jsem, že nastavení MultiColumn = True odbourá v ListBox posun po položkách šipkami vlevo - vpravo. Slouží pro posun po sloupcích. Asi máte boxy s jedním sloupcem, pak by šly šipky vlevo - vpravo použít pro zaměření ListBoxů, nebo jen jednu pro přepínání.

Zde přepíná pravá šipka, kdyby fokus neměl žádný z boxů, bude přidělený prvnímu.

   Private Sub Form1_KeyDown(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.KeyEventArgs) _
        Handles Me.KeyDown
     If e.KeyCode = Keys.Right Then
       If ListBox1.Focused Then
         ListBox2.Focus()
       ElseIf ListBox2.Focused Then
         ListBox1.Focus()
       Else
         ListBox1.Focus()
       End If
     End If
  End Sub

nahlásit spamnahlásit spam 1 / 1 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