2016-04-29 2 views
0

При первой проверке я предположил, что это была бы простая задача (может быть, она по-прежнему есть!), Но у меня возникают трудности. Предположим, у меня есть форма с 1000 текстовыми полями, где каждое текстовое поле содержит случайное распространение, но во многих случаях соответствует строкам. Например, ниже, можно найти в любом, если 1000: текстовые поляВыделите наборы совпадений в текстовом поле

AAAA-XXXX 
AAAA-XXXX 
BBBB-XXXX 
BBBB-XXXX 
CCCC-XXXX 
CCCC-XXXX 
    ... 

Как я мог бы перебрать текстовые поля, идентифицировать все примеры соответствия и высветить textbox.backcolor, где происходят матчи? Обратный цвет должен быть одинаковым для точных совпадений, но для каждого уникального набора совпадений он отличается. Там может быть до 100 различных наборов!

+0

'При х = 1 до 1000' с' Me.Controls ("TextBox" & х) '? –

ответ

1

Просто взбитые вместе рабочий тестовый проект, это такой подход я бы. Он избегает сравнения каждого текстового поля со всеми другими текстовыми полями. Я заметил все это для вас :)

Private Sub SetBoxColors() 

    'The keys are textbox texts, the values are the number of times it occurs 
    Dim UniqueTextsAndUsage As New Dictionary(Of String, Integer) 

    Dim FirstInstanceTextBoxes As New List(Of TextBox) 

    'The keys are textbox texts, the values are the colour for the box 
    Dim UniqueColors As New Dictionary(Of String, System.Drawing.Color) 

    'Iterate over all the text boxes 
    ' Substitute Me for your Form instance if necessary 
    For Each TBox As Control In Me.Controls 

     'Skip things that aren't textboxes 
     If Not TypeOf TBox Is TextBox Then 
      Continue For 
     End If 

     'If we have seen this textbox text before 
     If UniqueTextsAndUsage.ContainsKey(TBox.Text) Then 

      'Increase the usage 
      UniqueTextsAndUsage(TBox.Text) += 1 

      If UniqueTextsAndUsage(TBox.Text) = 2 Then 

       'This is the second usage, generate a colour for this set of boxes 
       UniqueColors.Add(TBox.Text, GenerateColor(UniqueColors.Count + 1)) 

      End If 

      'Colour this textbox 
      ' (it won't get the first instance of each unique string) 
      TBox.BackColor = UniqueColors(TBox.Text) 

     Else 

      'We have NOT seen this textbox text before 

      'Add the first occurence of the text 
      UniqueTextsAndUsage.Add(TBox.Text, 1) 

      'Mark this textbox as one we may have to colour later 
      FirstInstanceTextBoxes.Add(TBox) 

     End If 

    Next 

    'Colour all the first instances 
    For Each TBox As TextBox In FirstInstanceTextBoxes 

     'Check there are sufficient uses of this text 
     If UniqueTextsAndUsage(TBox.Text) > 1 Then 
      TBox.BackColor = UniqueColors(TBox.Text) 
     End If 

    Next 

End Sub 

Private Function GenerateColor(Id As Integer) As System.Drawing.Color 

    'Needs more thought - often too dark 
    Dim KnownColourByIdNumber As System.Drawing.KnownColor = Id 
    Return System.Drawing.Color.FromKnownColor(KnownColourByIdNumber) 

End Function 

Функция GenerateColor нуждается больше мысли так, что он создает некоторые более хорошие цвета, но я оставлю это для вас.

Возможно, вам также понадобится сброс, который устанавливает каждое поле в цвет DefaultControl или любое другое его имя и запускает его в верхней части SetBoxColors.

Matching text colours

+0

Спасибо за прекрасный ответ! Я многое узнал из этого, и это почти то, что мне нужно было сделать. Я буду работать, чтобы соответствовать его форме. Благодаря! – MalLav

1

Вы можете сделать это

Dim strText As String 
    For Each TextBox1 As System.Windows.Forms.TextBox In Me.Controls 
     strText = TextBox1.Text 
     For Each TextBox2 As System.Windows.Forms.TextBox In Me.Controls 
      If strText = TextBox2.Text AndAlso TextBox2.Name <> TextBox1.Name Then 
       TextBox2.BackColor = Color.Red ' or whatever you want to use 
       TextBox1.BackColor = Color.Red 
      End If 

     Next 
    Next 
+0

Спасибо за помощь! Я подошел к этой проблеме с аналогичным углом - это будет правильно идентифицировать совпадения, но как можно получить матчи с уникальным цветом? Все совпадения в вашем примере задают обратную цветность независимо от textbox.text. Еще раз спасибо! – MalLav

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