2013-11-20 5 views
2

У меня возникли проблемы с добавлением элемента в список из одного из моих классов. Мне не хватает чего-то, что явно над моей головой. Если кто-то может помочь мне понять, чего мне не хватает, это было бы здорово.Добавление элементов в ListView из класса

Я не знаю, сколько деталей мне нужно предоставить. То, что я пытаюсь сделать, - это базовое, поэтому я знаю, что я должен что-то пропускать. У меня есть класс, который я пытаюсь использовать для добавления элемента в список, который у меня есть на форме. Ошибок нет, но ничего не добавляется.

Я даже попытался использовать что-то столь же простое, как frmGiveaways.lstAccounts.items.add («wtf») в классе, он не бросает никаких ошибок, строка обрабатывается, но в списке нет элементов.

Что-то, что мешает мне сделать это?

Вот класс

Imports Simple_IRC_Client.Delegates 
    Imports System.Text.RegularExpressions 

    ''' <summary> 
    ''' Handles minimal IRC server response messages. 
''' </summary> 

Public Class OutputMessages : Implements IDisposable 

#Region " Private Members " 
    Private ReadOnly ColorQuit As Color = Color.FromArgb(102, 54, 31) 
    Private ReadOnly ColorPrivmsg As Color = Color.FromArgb(76, 76, 76) 
    Private ReadOnly ColorTopic As Color = Color.FromArgb(176, 55, 176) 
    Private ReadOnly ColorKick As Color = Color.FromArgb(199, 50, 50) 
    Private ReadOnly ColorUserEvent As Color = Color.FromArgb(128, 128, 128) 
    Private WithEvents _ircConnection As InitiateConnection 
    Private _mainView As MainView 
    Private _window As RichTextBox 
#End Region 

#Region " Constructor " 
    Public Sub New(ByVal mainView As MainView, ByVal ircConnection As InitiateConnection) 
     _mainView = mainView 
     _ircConnection = ircConnection 
     _window = _mainView.rtbChannelView 
    End Sub 
#End Region 

#Region " EventArghs " 

    Private Sub ServerResponse(ByVal serverResponse As String) Handles _ircConnection.ServerResponseOutputEventArghs 

     ' This setting has only been added for demonstration purposes of what raw data 
     ' looks like. 
     If _mainView.mnuMainMenuOptionsrawData.Checked Then 
      OutputResponse(_window, serverResponse, Color.Black) 
      Exit Sub 
     End If 

     Dim parts() As String = serverResponse.Split(" "c) 
     Dim address As String = parts(0) 

     Select Case parts(1) 
      Case "PRIVMSG" : Privmsg(address, serverResponse.Substring(indexOf(serverResponse, 3) + 1).Substring(1)) 
      Case "JOIN" : Join(address) 
      Case "PART", "QUIT" : Quit(address) 
      Case "ERROR" : Disconnected() 
      Case "332" : TopicOnjoin(serverResponse.Substring(indexOf(serverResponse, 4) + 1).Substring(1)) 
     End Select 
    End Sub 
#End Region 

#Region " Private" 

    ''' <summary> 
    ''' Outputs a GUI message on me/user Privmsg. 
    ''' </summary> 
    ''' <param name="address">The source of the user's local host.</param> 
    ''' <param name="message">The message text.</param> 
    ''' <remarks> 
    ''' Displays an output message to the normalview window with correct format and colouring on Me, 
    ''' User Privmsg. 
    ''' </remarks> 
    Private Sub Privmsg(ByVal address As String, ByVal message As String) 
     Dim outputFormat As String = String.Format("<{0}> {1}", Split(address), message) 
     OutputResponse(_window, outputFormat, Color.Black) 
     Select Case message 
      Case "" : _ircConnection.SendMessage(String.Format("PRIVMSG " & ConnectionInformation.Channel & " :" & "{0}", Split(address))) 
      Case frmGiveaways.keyword 
       _ircConnection.SendMessage(String.Format("PRIVMSG " & ConnectionInformation.Channel & " :" & "recieved keyword", Split(address))) 
       frmGiveaways.lstAccountsEntered.Items.Add(Split(address)) 
     End Select 

    End Sub 

    Private Sub Join(ByVal address As String) 
     If Split(address) = ConnectionInformation.ChannelNick Then 
      Exit Sub 
     End If 

     Dim outputFortmat As String = String.Format("{0} has joined the conversation.", Split(address)) 
     OutputResponse(_window, outputFortmat, ColorUserEvent) 

     'Welcome message proof of concept 
     '_ircConnection.SendMessage(String.Format("PRIVMSG " & ConnectionInformation.Channel & " :" & "Welcome, {0}", Split(address))) 

    End Sub 

    ''' <summary> 
    ''' Outputs a GUI message on user Quitting. 
    ''' </summary> 
    ''' <param name="address">The source of the user's local host.</param> 
    ''' <remarks> 
    ''' Displays an output message to the normalview window with correct format on user Quitting with Quit message. 
    ''' </remarks> 
    Private Sub Quit(ByVal address As String) 
     Dim outputFortmat As String = String.Format("{0} has left the conversation.", Split(address)) 
     OutputResponse(_window, outputFortmat, ColorUserEvent) 
    End Sub 

    Private Sub Disconnected() 
     Dim outputFortmat As String = "Disconnected!" 
     OutputResponse(_window, outputFortmat, Color.Red) 
    End Sub 

    Private Sub TopicOnjoin(ByVal subject As String) 
     OutputResponse(_window, String.Format("The chat's topic is: {0} ", subject), Color.Black) 
     NewLine() 
    End Sub 
#End Region 

#Region " Output Response " 
    ''' <summary> 
    ''' Displays the servers output response message. 
    ''' </summary> 
    ''' <param name="control">The control name.</param> 
    ''' <param name="output">The server output.</param> 
    ''' <param name="color">The control output line color</param> 
    ''' <remarks> 
    ''' Responsible for displaying all server and user response messages. 
    ''' </remarks> 
    Public Sub OutputResponse(ByVal control As RichTextBox, ByVal output As String, ByVal color As Color) 
     Dim outputFormat As String = String.Format("{0}", output) 

     If control.InvokeRequired Then 
      control.Invoke(New OutputEventHandler(AddressOf OutputResponse), control, output, color) 
     Else 
      Dim start = control.TextLength 
      Dim length = outputFormat.Length 

      With control 
       .AppendText(outputFormat & Environment.NewLine) 
       .ScrollToCaret() 
       .Select(start, length) 
       .SelectionColor = color 
      End With 
     End If 
    End Sub 

    Private Sub NewLine() 
     If _window.InvokeRequired Then 
      _window.Invoke(New MethodInvoker(AddressOf NewLine)) 
     Else 
      _window.AppendText(Environment.NewLine) 
     End If 
    End Sub 

#End Region 

#Region " Functions " 
    ''' <summary> 
    ''' 
    ''' </summary> 
    ''' <param name="s"></param> 
    ''' <param name="instance"></param> 
    ''' <returns></returns> 
    ''' <remarks></remarks> 
    Private Function indexOf(ByVal s As String, ByVal instance As Integer) As Integer 
     Dim startAt As Integer = -1 
     For x As Integer = 1 To instance 
      startAt = s.IndexOf(" "c, startAt + 1) 
     Next 
     Return startAt 
    End Function 

    Private Function Split(ByVal name As String) As String 
     Return name.Split("!"c)(0) 
    End Function 
#End Region 

#Region " IDisposable " 
    Public Sub dispose() Implements IDisposable.Dispose 

    End Sub 
#End Region 

End Class 

Часть меня возникли проблемы с является PRIVMSG под область Private.

+1

'помочь мне понять, что я missing' легче сделать, если мы могли бы увидеть код (изменить ваш вопрос - код не форматировать в комментариях) – Plutonix

+0

Обновил пост. – Josh

ответ

0

Основной синтаксис для добавления элементов в ListView это:

' Create list view items 
Dim item1 As New ListViewItem("Item #1", 0) 
Dim item2 As New ListViewItem("Item #2", 1) 
Dim item3 As New ListViewItem("Item #3", 2) 

Затем вы можете добавить элементы просматривать список в виде списка, либо индивидуально или в группе, например:

Добавление элемента один за одним:

ListView1.Items.Add(item1) 
ListView1.Items.Add(item2) 
ListView1.Items.Add(item3) 

Добавление нескольких элементов одновременно:

ListView1.Items.AddRange(New ListViewItem() {item1, item2, item3}) 

Примечание: ListView1.Items.Add() и ListView1.Items.AddRange() методы как нужно ListViewItem объекты, а не строковые значения.

+0

Я получаю это. Внутри формы что-то простое, как lstaccounts.items.add («test») работает нормально. У меня возникла проблема при попытке сделать это из класса, используя что-то простое, как frmgiveaways.lstaccounts.items.add («test»). Ошибок нет, но похоже, что есть какое-то ограничение доступа, код обрабатывается, но ничего не происходит. – Josh

+0

Отправьте свой код класса в свой вопрос выше. –

+0

Хорошо, я отправил класс. – Josh

1

вы можете создать метод на форме, которая принимает строку, чтобы создать новый элемент LV из текста прошел:

Public Sub AddNewLVItem(txtName As String) 
    Dim LVI as New ListViewItem 
    LVI.Text = txtName 

    LVI.Group = xxx  ' whatever other props there are 

    lstaccounts.items.Add(LVI) 
End Sub 

или стенографию, если нет подпунктов, группы и т.д.

lstaccounts.items.Add(New ListViewItem(txtName)) 

EDIT:

TYPICALLY, имя формы пуста только для дочерних форм MDI, я не уверен, почему это так, но это очевидно. Формы являются классами и ДОЛЖНЫ быть введены для использования. Они могут использовать старый метод экземпляра по умолчанию (FormName.Show), но он существует в основном для совместимости с VB4/5/6 днями, когда формы были чем-то отличным от классов. Старый экземпляр по умолчанию также облегчает для tinkerers (non-программистов), которые не имеют понятия о ООП, чтобы получить что-то вокование легко.

Для начала вам понадобится ссылка на frmGiveAways с уровнем приложения scope, чтобы другие классы ссылались на один и тот же объект.Добавление модуля в проект (если есть уже не один) и добавить:

Friend frmGive As frmGiveAways 

(или изменить название формы на что-то вроде FormGiveAways, так что имя экземпляра и весь код ссылки он все еще может использовать frmGiveAways).

Теперь, когда вы идете, чтобы показать форму в меню:

If frmGive Is Nothing Then  ' check to see if it already exists 
    frmGive = New frmGiveAways 
    frmGive.Show     ' could be a separate 'If' if needed 
End if 

Теперь есть один экземпляр frmGiveAways используя ссылку frmGive и до тех пор, как каждый использует, что ссылка, все будет работать нормально , В «Sub AddEntry» он должен заплатить, чтобы установить прерывание и некоторое время контролировать значение Me.Name, чтобы убедиться, что весь код вызова правильно реорганизован.

НТН

+0

Хорошо, это действительно странно. В форме я добавил: 'Public Sub AddEntry (счет As String) lstAccountsEntered.Items.Add (счет) End Sub' и назвал его из класса: ' frmGiveaways.AddEntry (Split (адрес)) ' Суб обрабатывается, строка передается, но до сих пор ничего не добавляется. Я могу добавить кнопку на той же форме с кодом: 'Private Sub btnPick_Click (отправитель As Object, е Как EventArgs) Ручки btnPick.Click lstAccountsEntered.Items.Add ("тест") End Sub' и добавляет элемент просто отлично ... – Josh

+0

код выше не добавляет строку в LV, он добавляет ListViewItem. Карл сказал вам это, и я вам это сказал. Вы должны хотя бы попробовать. – Plutonix

+0

Как это? 'Public Sub AddEntry (счет As String) ListView1.Items.Add (Новый ListViewItem (счет)) End Sub' или это? 'Public Sub AddEntry (счет As String) Dim LVI Как Новый ListViewItem (счет) ListView1.Items.Add (LVI) End Sub' или это? 'Public Sub AddEntry (счет As String) Dim LVI Как Новый ListViewItem lvi.Text = счета ListView1.Items.Add (LVI) End Sub' Отсутствует работа, несмотря на все еще обрабатывается без ошибок и передает строку ,Однако я могу добавить ту же строку, используя кнопку в форме. – Josh

1

Вместо жесткого кодирования ListView, попробуйте передать его в суб в качестве параметра.

Что-то вроде этого:

Private Sub Privmsg(ByVal address As String, ByVal message As String, ByRef LV as ListView) 
    Dim outputFormat As String = String.Format("<{0}> {1}", Split(address), message) 
    OutputResponse(_window, outputFormat, Color.Black) 
    Select Case message 
     Case "" : _ircConnection.SendMessage(String.Format("PRIVMSG " & ConnectionInformation.Channel & " :" & "{0}", Split(address))) 
     Case frmGiveaways.keyword 
      _ircConnection.SendMessage(String.Format("PRIVMSG " & ConnectionInformation.Channel & " :" & "recieved keyword", Split(address))) 
      LV.Items.Add(Split(address)) 
    End Select 

End Sub 
+0

Вы имеете в виду вот это? 'Public Sub AddEntry (account As String) ListView1.Items.Add (новый ListViewItem (учетная запись)) End Sub' Не работает, несмотря на то, что все еще обрабатывается без ошибок и передает строку. Однако я могу добавить ту же строку, используя кнопку в форме. – Josh

+0

Я имел в виду передачу списка в подпрограмму, а не только строку. Я добавил образец к моему ответу. – tinstaafl

+0

Как бы я установил LV в правый список? – Josh

Смежные вопросы