Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: "multiline" listbox tai jotain

Sivun loppuun

novice [23.10.2008 21:15:24]

#

Heippa taas.

Ohjelma mikä olisi tarkoitus tehdä tässä kunhan ensin opin ohjelmoimaan, olisi eräänlainen laskenta ohjelma millä lasketaan tiettyihin työtehtäviin kuluva aika (en viitsi sitä nyt enempää selventää).

Ohjelmalle annetaan ensin pari tietoa; millä tehdään ja mistä tehdään. Nämä molemmat antavat ojelmalle laskennassa käytettävät arvot.
Sen jälkeen valitaan työtehtävään tarvittavia tapahtumia joihin kuluvan ajan ohjelma laskee 'millä' ja 'mistä' arvojen perusteella.
Tuloksena pitäisi olla tämän kaltainen tulostettava lista: (höh.. en nyt millään saanut tuota oikeanlaiseksi, mutta toivottavasti ymmärrätte. Pystyviivojen pitäisi olla samalla kohtaa)

Työtehtävä:XXXXX   millä:YYYY    mistä:ZZZZ
___________________________________________
Tapahtuma |         arvot           | aika
__________|_________________________|______
QQQ       |A5.5  B44  C600  D1  E4  |   2
__________|_________________________|______
WWW       |A4    B0.1 C890  D66     |   6
__________|_________________________|______
EEE       |X0    Y40                |
          |X20   Y1.4               |
          |X22   Y-6                |
          |X0.9  Y-90 C0.4      E99 |   12
__________|_________________________|______
RRR       |           C8    D12     |   0.7
__________|_________________________|______
TTT       |C120  T1                 |
          |C2    T0                 |   7
__________|_________________________|______
Yhteensä:                              27.7

Huomaa: tapatumat EEE ja TTT vaativat useamman rivin.
Listassa olevia tapahtumia pitäisi päästä klikkaamalla muokkaamaan.

Miten tällainen kannataisi toteuttaa? Ajattelin ensin listboxia mutta kun siihen ei saa osiota kuin yhdelle riville... vai saako? Joka tapauksessa tapahtuman sisältävän osion pitäisi sisältää useamman rivin.

Mod. lisäsi kooditagit

novice [24.10.2008 21:13:47]

#

Hmmm.. Taisin keksiä ratkaisun ihan itse. Pitää kokeilla.

ajv [25.10.2008 09:08:26]

#

Kerro toki meillekkin.

neau33 [26.10.2008 17:10:15]

#

Heippa taas novice!

voisitko valaista hieman lisää, eli siis...
tapahtuma-solun arvon ollessa QQQ ja millä-arvon ollessa YYYY ja mistä-arvon ollessa ZZZZ arvot-solun arvo on A5.5 B44 C600 D1 E4, josta laskien saadaan aika-solun arvoksi 2 (copy/pasteta ihmeessä kaava tänne)? Mitä muuten pitäisi tapahtua arvot-solun sisällölle jos vaihdetaan mistä-arvoksi vaikkapa sahajauho, tapahtuman ollessa edelleen QQQ - vaihtuuko arvot-solun sisältö...jolloin luonnollisesti aika-solun arvon pitäisi myös muuttuman? Tai jos jätetään mistä-arvo ennalleen ja vaihdetaan tapahtuma-arvoksi RRR QQQ:n tilalle, pitäisikö arvot-solun arvoksi tällöin tulla C8 D12 ja aika-solun arvoksi0.7?

Jos taas ajatellaan että taphtuman ollessa QQQ on millä-arvo automaattisesti YYYY ja mistä-arvo automaattisesti ZZZZ ja arvot-solun arvo automaattisesti A5.5 B44 C600 D1 E4 ja aika-solun arvo automaattisesti 2 niin tietolähteeksi riittää yksi yksinkertainen tietokantataulu:

Tapahtuma TEXT |millä TEXT|mistä TEXT|arvot MEMO             |aika DOUBLE|
QQQ            |YYYY      |ZZZZ      |A5.5  B44  C600  D1  E4|          2|
'...
'...
EEE      |kirveellä|puusta|X0    Y40;X20   Y1.4;X22   Y-6;X0.9  Y-90 C0.4      E99|  12|
' jne...

HUOMAA EEE-tapahtumassa puolipisteellä erotetut arvot (helpompi splitata)...ja laskukaavaksi muodostuu vain aika-solujen arvojen ynnääminen yhteen(sä)...

YKSINKERTAISTETTU MALLI (väännetty SharpDevelop 3.0:lla)
imppaa mallitietokanta täältä ja pura C:\aseman juureen...

Imports System
Imports System.Data
Imports System.Data.OleDb
Imports Microsoft.VisualBasic


Public Partial Class MainForm: Inherits Form

  '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  '*                                                               *
  '* Formille:                                                     *
  '*                                                               *
  '* 3 ComboBox'ia - (cboEvents [DropDownStyle=DropDownList],      *
  '*                 cboEquipment [DropDownStyle=Simple],          *
  '*                 cboMaterial [DropDownStyle=Simple])           *
  '*                                                               *
  '* 1 ListBox - (lstShow [Font=Courier New, Normal , 9])          *
  '*                                                               *
  '* 2 Nappia - (btnOK [Text="Compute" Visible/Enabled=False]      *
  '*             btnCancel [Text="Cancel" Visible/Enabled=False])  *
  '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

  Dim rdelim As String = ""
  Dim colH1 As String = " Tapahtuma"
  Dim colH2 As String = "    arvot    "
  Dim colH3 As String = " aika"
  Public Shared WithEvents _
  dsValues As DataSet  = New DataSet

  Public Sub New()
    Me.InitializeComponent()
  End Sub

  Sub MainFormLoad(sender As Object, e As EventArgs)

    Dim constr As String = _
    "Provider=Microsoft.Jet.OLEDB.4.0; " + _
      "Data Source=C:\Tietokanta.mdb"

      Dim con As OleDbConnection = _
      New OleDb.OleDbConnection(constr)
      constr = Nothing
      Try
        con.Open
      Catch ex As Exception
      End Try

      If connectionstate.Open Then

        Dim query As String = _
        "Select * From [Taulu1]"
        Dim ds As DataSet = New DataSet
        Dim da As New OleDbDataAdapter(query, con)
        da.Fill(ds, "Taulu1")
        cboEvents.DataSource = ds.Tables("Taulu1")
        cboEvents.DisplayMember = "Tapahtuma"
        cboEvents.SelectedIndex = 0
        cboEquipment.DataSource = ds.Tables("Taulu1")
        cboEquipment.DisplayMember = "millä"
        cboEquipment.SelectedIndex = 0
        cboMaterial.DataSource = ds.Tables("Taulu1")
        cboMaterial.DisplayMember = "mistä"
            da.TableMappings.Clear
            query = "Select arvot, aika From [Taulu1]"
            da = New OleDbDataAdapter(query, con)
        da.Fill(dsValues, "Taulu1")
        da = Nothing: query = Nothing

        con.Close

      End If

  End Sub

  Sub CboEventsSelectedIndexChanged( _
  sender As Object, e As EventArgs)

    If cboEvents.SelectedIndex = 0 Then
      Exit Sub
    End If

    If lstShow.Items.Count = 0 Then
         lstShowAddHeaders
    End If

    For i As Integer = 1 To lstShow.Items.Count - 1
      If lstShow.Items(i).indexOf(cboEvents.Text.Trim) > - 1 Then
         Exit Sub
      End If
    Next

    Try

      Dim hlpStr() As String = _
      dsValues.Tables("Taulu1").Rows( _
      cboEvents.SelectedIndex)("arvot").Split(";")

        If Not hlpStr Is Nothing Then
          For i As Integer = 0 To _
          hlpStr.GetUpperBound(0)
            Select Case i
              Case 0
                If hlpStr.GetUpperBound(0) > 0 Then
                  lstShow.Items.Add( _
                  " " + cboEvents.Text + _
                  Space(12 - cboEvents.Text.Length) + _
                  "|" + hlpStr(i) + _
                  Space(25 - hlpStr(i).Length) + "|")
                Else
                  lstShow.Items.Add( _
                  " " + cboEvents.Text + _
                  Space(12 - cboEvents.Text.Length) + _
                  "|" + hlpStr(i) + _
                  Space(25 - hlpStr(i).Length) + "|" + _
                  Space(12 - Format(dsValues.Tables("Taulu1").Rows( _
                  cboEvents.SelectedIndex)("aika"),"0.00").Length) + _
                  Format(dsValues.Tables("Taulu1").Rows( _
                  cboEvents.SelectedIndex)("aika"),"0.00"))
                 lstShow.Items.Add(rdelim)
               End If
            Case 1 To hlpStr.GetUpperBound(0) -1
              lstShow.Items.Add( _
              " " +  _
              Space(12) + _
              "|" + hlpStr(i) + _
              Space(25 - hlpStr(i).Length) + "|")
            Case hlpStr.GetUpperBound(0)
              lstShow.Items.Add( _
              " " + Space(12) + _
              "|" + hlpStr(i) + _
              Space(25 - hlpStr(i).Length) + "|" + _
              Space(12 - Format(dsValues.Tables("Taulu1").Rows( _
              cboEvents.SelectedIndex)("aika"),"0.00").Length) + _
              Format(dsValues.Tables("Taulu1").Rows( _
              cboEvents.SelectedIndex)("aika"),"0.00"))
              lstShow.Items.Add(rdelim)
          End Select
        Next
        EnableButtons
      End If
    Catch ex As Exception
    End Try

  End Sub

  Sub BtnOKClick(sender As Object, e As EventArgs)

    Select Case BtnOK.Text

      Case "Compute"

        Dim drow As DataRow
        Dim tValue As Double
        Dim j As Integer = 0
        For Each drow In _
        dsValues.Tables("Taulu1").Rows
          For i As Integer = 0 To _
          lstShow.Items.Count -1
            Dim hlpStr() As String = _
            dsValues.Tables("Taulu1").Rows(j)(0).Split(";")
            For k As Integer = hlpStr.GetUpperBound(0) To _
            hlpStr.GetUpperBound(0)
              If  lstShow.Items(i).IndexOf(hlpStr(k)) > -1 Then
                tValue += drow.Item(1): Exit For
              End If
            Next k: hlpStr = Nothing
          Next i
          j += 1
        Next: drow = Nothing
        lstShow.Items.Add(" Yhteensä:" + _
        Space(42 - Format(tValue,"0.00").Length) + _
        Format(tValue,"#0.00"))
        BtnOK.Text = "Print": Exit Sub

      Case "Print"

        printStr = String.Empty

        For i As Integer = 0 To lstShow.Items.Count -1
          printStr += lstShow.Items(i) _
          + Environment.NewLine
        Next

        Dim fPrintForm As Form = New PrintForm
        fPrintForm.ShowDialog
        fPrintForm = Nothing
        cboEvents.SelectedIndex = 0
        lstShow.Items.Clear
        DisableButtons

    End Select

  End Sub

  Sub lstShowAddHeaders()

    lstShow.Items .Add( _
    colH1 + Space(10) + colH2 +  Space(10) + colH3)

    rdelim += _
    " ------------|" & _
    "-------------------------|" & _
    "------------"
    lstShow.Items .Add(rdelim)

  End Sub

  Sub btnCancelClick(sender As Object, e As EventArgs)

    cboEvents.SelectedIndex = 0
    lstShow.Items.Clear
    DisableButtons

  End Sub

  Sub EnableButtons()

    btnOK.Visible = True
    btnOK.Enabled = True
    btnOK.Text = "Compute"
    btnCancel.Visible = True
    btnCancel.Enabled = True

  End Sub

  Sub DisableButtons()

    btnOK.Visible = False
    btnOK.Enabled = False
    btnOK.Text = "Compute"
    btnCancel.Visible = False
    btnCancel.Enabled = False

  End Sub

  Sub lstShowClearAllSelections()

    If lstShow.SelectedItems.Count > 0 Then
      For i As Integer = 0 To lstShow.Items.Count -1
        lstShow.SetSelected(i,False)
      Next
    End If

  End Sub

  Sub LstShowSelectedIndexChanged( _
  sender As Object, e As EventArgs)

    If lstShow.SelectedItems.Count > 0 Then
      If lstShow.SelectedItem.indexOf("---") > -1 Or _
        lstShow.SelectedItem.indexOf("Tapahtuma") > -1  Or _
        lstShow.SelectedItem.indexOf("Yhteensä") > -1 Then
        lstShowClearAllSelections
      End If
    End If

  End Sub

End Class
Imports System
Imports System.Drawing
Imports Microsoft.VisualBasic.PowerPacks
' Jos GAC:sta ei löydy assembly'a Microsoft.VisualBasic.PowerPacks
' niin imppaa [linkki "http://www.microsoft.com/downloads/details.aspx?familyid=92faa81e-e9c1-432c-8c29-813493a04ecd&displaylang=en"]täältä[/linkki] ja asentele...

Public Partial Class PrintForm

  '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  '* Formi (Text ei mtään - BackColor=Black FormBorderStyle=None - *
  '*        Size=425; 438 - fontti Courier New,Normal, 9           *
  '*                                                               *
  '* Formille:                                                     *
  '* 1 TextBox (PrintBox - fontti Courier New,Normal, 9            *
  '*            BorderStyle=None - BackColor White                 *
  '*            Location 1;1 - Size 423; 436                       *
  '*                                                               *
  '* 1 Timer-ohjausobjekti                                         *
  '* 1 printForm-ohjausobjekti (jos ei löydy Tools/Windows Forms-  *
  '* laatikosta niin klikkaa laatikossa hiiren oikealla, valitse   *
  '* Configure SideBar (tai vastaavaa), klikkaa vasemmassa laati-  *
  '* kossa tekstiä: Windows Forms, klikkaa Add Components nappia   *
  '* valitse GAC-välilehti, etsi listalta Microsoft.VisualBasic.   *
  '* PowerPacks tuplaklikkaa nimeä ja klikkaile OK:ta              *
  '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

  Public Sub New()
    Me.InitializeComponent()
  End Sub

  Sub PrintFormLoad(sender As Object, e As EventArgs)
     Me.PrintBox.Tag = printStr
     printStr = String.Empty
  End Sub

  Sub PrintFormShown(sender As Object, e As EventArgs)
    Timer1.Interval = 500
    Timer1.Enabled = True
    Timer1.Start
  End Sub

  Sub PrintBoxEnter(sender As Object, e As EventArgs)
    focusbox.Focus
  End Sub

  Sub Timer1Tick(sender As Object, e As EventArgs)
    If Me.PrintBox.Text  = _
    Me.PrintBox.Tag Then
        Try
        PrintForm1.Print()
      Catch ex As Exception
        End Try
        Me.Close
    End If
    Me.PrintBox.Text = Me.PrintBox.Tag
  End Sub

End Class

Sensijaan jos arvot-solun sisältö koostuukin muuttujista, joiden arvot muuttuvat prosessin aikana, alkaa koodaamisessa olla haastetta...

novice [26.10.2008 22:48:10]

#

Hmmm... En jaksanut paneutua vastaukseesi, sillä kuten jo sanoin; keksin ratkaisun itse.
Homma menee kuitenkin kutakuinkin siten kuin ensimmäisessä kappaleessa kysyit.

Alkuperäinen ogelma oli saada listboxin tyypinen luettelo tapahtumista. Listbox ei kuitenkaan siihen soveltunut koska siihen saa vain yhden rivin/klikattava 'osio'.

Tein (siis kokeilin, että homma toimii) oman listboxin joka koostuu textboxeista.
Eli kun uusi tapahtuma aloitetaan, ohjelma luo uuden textboxin(readonly) edellisen alle johon kyseisen tapahtuman arvot tulostetaan. Textboxia klikkaamalla avautuu kyseisen tapahtuman 'asetuslomake' josta arvoja pääsee tarvittaessa muokkaamaan.
'Tapahtumaboxeja' voi olla alekkain jopa 40-50 ja niitä pääsee selaamaan scrollbarilla (tällähetkellä harjoittelussa).
Kunnes kaikki tapahtumat on laskettu, ohjelma kopioi ne alekkain yhdelle textboxille josta ne voi sitten tulostaa (tätä en ole vielä edes kokeillut / opetellut, mutta uskon sen onnistuvan kivuttomasti).

Esimerkissähän kaikki arvot on vedetty hatusta, toivottavasti et ole kovin kauaa aikaasi tuhlannut olemattoman kaavan selvittämiseen ;)

Tässä vaiheessa en ole saanut vielä riviäkään varsinaista koodia aikaiseksi. Olen vain harjoitellut, kokeillut ja tutkinut mikä kaikki on mahdollista ja miten asiat kannatta lopulliseen ohjelmaan tehdä. Ohjelman layout(formit, buttonit boxit yms.) alkaa kuitenkin pikkuhiljaa olemaan valmis.

Kiitos kuitenkin vastauksesta, tutkin sen takuulla jossain vaiheessa.

novice [27.10.2008 19:27:27]

#

Hei

Enpä onnistunutkaan tekemään haluamaani listboxia ;( Ongelmaksi muodostui luodun textboxin valinta.
Eli miten saan tietoon aktiivisen textboxin nimen? Ja miten saan textboxin taustavärin vaihtumaan sitä klikatessa. Textboxejahan ei ole koodaus vaiheessa vaan ne luodaan vasta itse ohjelmassa.

neau33 [27.10.2008 21:01:40]

#

Moikka taas novice

kerroit tuossa aikaisemmin hieman satuja kirjoittamalla, että ListBox-ohjausobjektiin "saa vain yhden rivin/klikattava 'osio'"...

'testaa tällä...
Imports System
Imports System.Drawing
Imports Microsoft.VisualBasic
Imports System.Windows.Forms

Public Partial Class MainForm: Inherits Form

  Dim cols As String = _
  "Tapahtuma |         arvot           | aika "
  Dim rdelim As String = _
  "----------|-------------------------|------"
  Dim checking As Boolean = False
  Dim findex As Integer = -1
  Dim sindex As Integer = -1
  Dim eindex As Integer = -1
  Dim dblclk As Boolean = False

  Public Sub New()
    Me.InitializeComponent()
  End Sub

  Sub MainFormLoad(sender As Object, e As EventArgs)
    'esimerkkidata --------
    ListBox1.Items.Add(cols)
    ListBox1.Items.Add(rdelim)
    ListBox1.Items.Add( _
    "QQQ       |A5.5  B44  C600  D1  E4  |   2  ")
    ListBox1.Items.Add(rdelim)
    ListBox1.Items.Add( _
    "EEE       |X0    Y40                |      ")
    ListBox1.Items.Add( _
    "          |X20   Y1.4               |      ")
    ListBox1.Items.Add( _
    "          |X22   Y-6                |      ")
    ListBox1.Items.Add( _
    "          |X0.9  Y-90 C0.4      E99 |   12 ")
    ListBox1.Items.Add(rdelim)
    '------------------------
    TextBox1.TextAlign = 0
    TextBox1.ReadOnly = True
    TextBox2.TextAlign = 0
    TextBox3.TextAlign = 2
    TextBox3.ReadOnly = True
    ListBox1.SelectionMode = 2
    ListBox1.Font = New Font( _
    "Courier New", 9, FontStyle.Regular)
    EditControlsHide

  End Sub

  Sub ListBox1DoubleClick(sender As Object, e As EventArgs)
    dblclk = True
  End Sub

  Sub ListBox1SelectedIndexChanged( _
  sender As Object, e As EventArgs)

    If ListBox1.SelectedItems.Count > 0 Then
      If Not checking Then
        CheckSelectedItems(sender)
      End If
    End If

  End Sub

  Sub Button1Click(sender As Object, e As EventArgs)

    Dim ctl As Control, i As Integer = 0
    Dim hlpStr( _
    ListBox1.SelectedItems.Count - 1) As String

    Dim item As Object
    Dim itemArray(0) As String
    Dim cnt As Integer = 0

    For Each item In ListBox1.SelectedIndices
      ReDim Preserve itemArray(cnt)
      itemArray(cnt) = ListBox1.Items(item)
      cnt += 1
    Next
    cnt -= cnt

    For Each ctl In Me.Controls
        If ctl.Name = "textBox" + CStr(i + 1) Then
          If ctl.Text <> ctl.Tag Then
            Dim tagArray() As String
            Dim txtArray() As String
              Dim tagStr As String  = ctl.Tag.Replace( _
              Environment.NewLine, ";")
              Dim txtStr As String  = ctl.Text.Replace( _
              Environment.NewLine, ";")
              tagArray = tagStr.Split(";")
              tagStr = Nothing
              txtArray = txtStr.Split(";")
              txtStr = Nothing
              For j As Integer = 0 To _
              tagArray.GetUpperBound(0)
                itemArray(j) = itemArray(j). _
                Replace(tagArray(j), txtArray(j))
                ctl.Text = String.Empty
                ctl.Tag = String.Empty
              Next
              tagArray = Nothing: txtArray = Nothing
          End If
          ctl.Visible = False: ctl.Enabled = False
          i += 1
        Elseif ctl.Name = "button1" Then
          ctl.Visible = False: ctl.Enabled = False
        End If
    Next

    For Each item In ListBox1.SelectedIndices
      If ListBox1.Items(item) <> itemArray(cnt) Then
        Dim colArray() As String = _
        itemArray(cnt).Split("|")
        For i = 0 To colArray.GetUpperBound(0)
          Select Case i
            Case 0
              colArray(i) = colArray(i) + _
              Space(10 - colArray(i).Length) + "|"
            Case 1
              colArray(i) = colArray(i) + _
              Space(25 - colArray(i).Length) + "|"
            Case 2
              colArray(i) = Space(10 - _
              colArray(i).Length) + colArray(i)
          End Select
        Next
        itemArray(cnt) = String.Empty
        For i = 0 To colArray.GetUpperBound(0)
          itemArray(cnt) += colArray(i)
        Next: colArray = Nothing
          checking = True
          ListBox1.Items(item) = itemArray(cnt)
        checking = False
      End If
      cnt += 1
    Next: i = Nothing

    itemArray = Nothing: item = Nothing
      cnt = Nothing: dblclk = False
      ClearSelections(ListBox1)

  End Sub

  Sub CheckSelectedItems(lstBox As ListBox)

    For i As Integer = 0 To lstBox.Items.Count - 1

          If lstBox.Items(i).IndexOf("---") > -1 _
      Or lstBox.Items(i).IndexOf("Tapahtuma") > -1  _
      Or lstBox.Items(i).IndexOf("Yhteensä") > -1 Then
        checking = True
        lstBox.SetSelected(i, False)
        checking = False
      End If
        Next

        If findex <> sindex And eindex > sindex Then
          Dim done As Boolean = False
          For i As Integer = sindex To eindex
            If lstBox.Items(i).IndexOf("---") < 0 _
        And lstBox.Items(i).IndexOf("Tapahtuma") < 0 _
        And lstBox.Items(i).IndexOf("Yhteensä") < 0 Then
          checking = True
            lstBox.SetSelected(i,True)
            If findex <> i And done = False Then
            findex = i: done = True
            End If
            checking = False
        End If
          Next
        End If
        sindex = -1: eindex = -1

  End Sub

  Sub EditControlsHide

    Dim ctl As Control
    For Each ctl In Me.Controls
      If ctl.Name.IndexOf("textBox") > -1 Then
        ctl.Text = String.Empty
        ctl.Tag = String.Empty
        ctl.Visible = False
        ctl.Enabled  = False
        ctl.Height = 20
      ElseIf ctl.Name.IndexOf("button1") > -1 Then
        ctl.Tag = String.Empty
        ctl.Visible = False
        ctl.Enabled  = False
      End If
    Next

  End Sub

  Sub ListBox1Click(sender As Object, e As EventArgs)

    If Not dblclk Or dblclk And _
    ListBox1.SelectedItems.Count > 1 Then
      ClearSelections(sender)
      dblclk = False
    Else
      SetSelections(sender)
      dblclk = False
    End If

  End Sub

  Sub SetSelections(lstBox As ListBox)

    If lstBox.SelectedItems.Count > 0 Then

      If lstBox.Items( _
      lstBox.SelectedIndex).indexOf("---") > -1 Or _
      lstBox.Items( _
      lstBox.SelectedIndex).indexOf("Tapahtuma") > -1 Or _
      lstBox.Items( _
      lstBox.SelectedIndex).indexOf("Yhteensä") > -1 Then
        dblclk = False: Exit Sub
      End If
      Dim srow As Integer = 0
      Dim erow As Integer = 0
      If lstBox.SelectedIndex > 2 Then
        For i As Integer = _
        lstBox.SelectedIndex To 2 Step - 1
            If lstBox.Items(i).indexOf("---") = -1 Then
                 srow = i
               Else: Exit For
               End If
        Next
      End If

      If srow > 0 Then
        For i As Integer = _
        srow To lstBox.Items.Count - 2
            If lstBox.Items(i).indexOf("---") = -1 Then
                 erow = i
                 checking = True
                 lstBox.SetSelected(i, True)
                 checking = False
               Else
                 Exit For
               End If
        Next
      End If

      If lstBox.SelectedItems.Count > 0 Then

          Dim ctl As Control, j As Integer = 0
          back:
          For Each ctl In Me.Controls
            If ctl.Name = "textBox" + CStr(j + 1) Then
              Dim txtBox As TextBox = ctl
                ctl.Visible = True: ctl.Enabled = True
                Dim item As Object
                If lstBox.SelectedItems.Count > 1 Then
                  txtBox.Multiline = True
                  If lstBox.SelectedIndices.Count < 5 Then
                  txtBox.Height += _
                  ((txtBox.Font.Size + 5) *(lstBox.SelectedIndices.Count -1))
                  txtBox.ScrollBars = 0
                  ElseIf lstBox.SelectedIndices.Count > 4 Then
                      txtBox.Height += (txtBox.Font.Size + 5) * 4
                    txtBox.ScrollBars = 2
                  End If
                Else
                  txtBox.Multiline = False
                  txtBox.Height = 20
                End If
                Dim cnt As Integer = 0
                For Each item In lstBox.SelectedIndices
                  Dim strArray() As String = _
                lstBox.Items(item).Split("|")
                  If cnt < lstBox.SelectedIndices.Count - 1 Then
                    txtBox.Text += strArray(j).Trim + Environment.NewLine
                    txtBox.Tag += strArray(j).Trim + Environment.NewLine
                  Else
                    txtBox.Text += strArray(j).Trim
                    txtBox.Tag += strArray(j).Trim
                  End If
                  strArray = Nothing
                  cnt += 1
                Next
                cnt = Nothing
                j += 1
                txtBox = Nothing
                If j < 3 Then
                   Goto back
                End If
            Elseif ctl.Name = "button1" Then
                ctl.Visible = True: ctl.Enabled = True
            End If
          Next: j = Nothing
      End If

    End If

  End Sub

  Sub ClearSelections(lstBox As ListBox)
    If lstBox.Items.Count > 0 Then
          For i As Integer = 0 To _
      lstBox.Items.Count - 1
        checking = True
              lstBox.SetSelected(i, False)
              checking = False
          Next i
          EditControlsHide
    End If
  End Sub

End Class

novice [28.10.2008 13:55:06]

#

No siltäpä näyttää...

Okei.. Aktiivisen kontrollin nimen hakeminen onnistui esim. näin:

Private Sub TextBox0_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox0.Click
        Dim active As String = Me.ActiveControl.Name
        textbox1.Text = active
    End Sub

Mutta tämä kertoo vain textbox0:n nimen ja jos laitan tämän koodin buttonille, niin textbox1:een tulostuu buttonin nimi.
Miten saan tulostettua textbox1:een minkä tahansa klikatun textboxin nimen?
Edelleenkin textboxit luodaan vasta itse ohjelmassa.


EDIT:
Noniin... löysin ohjeet:

'FORMILLE 3 TEXTBOXIA JA BUTTON
Public Class Form1
    Private PreviousControl As Control

    Private Sub Form1_Load(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles MyBase.Load
        doSet(Me)
    End Sub

    Private Sub doSet(ByVal parentCtr As Control)
        Dim ctr As Control
        For Each ctr In parentCtr.Controls
            AddHandler ctr.Leave, AddressOf meLeave
            doSet(ctr)
        Next
    End Sub

    Private Sub meLeave(ByVal sender As Object, _
    ByVal e As System.EventArgs)
        PreviousControl = DirectCast(sender, Control)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button1.Click
        TextBox3.Text = PreviousControl.Name

    End Sub

End Class

neau33 [28.10.2008 16:00:56]

#

Moikka taas novice!

Tämä nyt alkaa mennä vähän sivuun ListBox-kontrollista, mutta...

Jos formille pitää luoda lennossa ennalta tuntematon määrä ohjausobjekteja eikä käytetä mitään ulkoista Script-kontrollia, niin tapahtumien tunnistaminen voi käydä hankalaksi, tässä kuitenkin eräs ratkaisu...

(väännety SharpDevelop 3.0:lla)

Imports System
Imports System.Drawing
Imports System.Threading
Imports System.Windows.Forms
Imports Microsoft.VisualBasic

Public Partial Class MainForm: Inherits Form

  ' alustetaan boolean-muuttuja (koko formin käyttöön)
  ' ja annetaan lähtöarvoksi EPÄTOSI
  Dim EndProg As Boolean = False

  Public Sub New()
    Me.InitializeComponent()
  End Sub

  Sub MainFormShown(sender As Object, e As EventArgs)

    'asetetaan staattinen Boolean-muuttuja (säilyttää arvon)
    Static fshown As Boolean

    ' jos muuttujan arvo on EPÄTOSI...
    If Not fshown Then
      ' ...asetetaan Boolean-muuttujan arvoksi TOSI
      ' (ei ehkä niinkään tarpeelinen tässä,
      ' mutta jos pääformi esim. piilotettaisiin...)
      fshown = True

      ' ja siirrytään aliohjelmaan...
      ProgramMainLoop

    End If

  End Sub

  Sub ProgramMainLoop()

    ' Siirretään fokus textBox1:lle
    ' ennen luuppiin siirtymistä...
    textBox1.Focus

    ' ja lähdetään pyörimään kieppiä ympäri
    ' niin kauan, kunnes toisin määrätään...
    Do While Not EndProg: Application.DoEvents

      ' asetetaan pieni viive, jottei syötäisi
      ' aivan mahdottomasti resursseja...
      Thread.Sleep(200)

      ' Jos formin aktiivisen ohjausobjektin nimi
      ' ei ole 'textBox1', mutta aktiivisen ohjausobjektin
      ' tyyppi on 'System.Windows.Forms.TextBox' niin...
      If Me.ActiveControl.Name <> "textBox1" _
        And Me.ActiveControl.GetType. _
        ToString.IndexOf("xtB") > -1 Then
        ' kopioidaan aktiivisen ohjausobjektin tekstiarvo
        ' texBox1-tekstiarvoksi ja...
        textBox1.Text = Me.ActiveControl.Text
        ' asetetan texBox1 aktiiviseksi ohjausobjektiksi
        ' siirtämällä sille fokus...
        textBox1.Focus
      End If
    Loop
  End Sub

  Sub MainFormFormClosing( _
  sender As Object, e As FormClosingEventArgs)

    'Suljettaessa ohjelmaa päästään tällä asetuksella
    'ulos aliohjelman 'ProgramMainLoop' luupista
    EndProg = True

    Me.Dispose
  End Sub

  Sub MainFormFormClosed( _
  sender As Object, e As FormClosedEventArgs)
    End
  End Sub

End Class

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta