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
Hmmm.. Taisin keksiä ratkaisun ihan itse. Pitää kokeilla.
Kerro toki meillekkin.
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...
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.
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.
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
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
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
Aihe on jo aika vanha, joten et voi enää vastata siihen.