Visual Basic, .NET, ASP, VBA, VBScript
 
  Библиотека кодов  
  Работа с контролами  
     
  Автоматическое упорядочивание элементов списка в MSHFlexGrid  
       Достаточно часто в программах бывает необходимо вывести частичный список сотрудников - для премирования, поощрения или наказания. При этом желательно вывести их в соответствии с занимаемыми должностями (директор, 1зам, и т.д.). Проблема в том, что список может требовать правки, и, при добавлении главбуха, он может оказаться в списке после уборщицы. Если сотрудников немного, их состав не меняется, то проблем нет - сортировка по индивидуальному номеру в порядке возрастания. В большой фирме, где к тому же сами должности могут добавляться и удаляться такой подход не оправдан. Можно, конечно, зашифровать должность как код должности и ввести поле подстановки в соответствующую таблицу, но кто этим будет заниматься, тем более с готовой БД?
     Пример заполнения судовой роли для нашего яхт-клуба гарантирует, что матрос не будет в судовой роли стоять выше боцмана, или пассажир выше кока.

Предположим, что имеется список сотрудников (в данном случае моряков), из которого переносятся данные в MSHFlexGrid1, после чего вызывается следующая процедура
Private Sub RankCrwes()
Dim intRows As Integer
Dim intTemp As Integer, intY As Integer
Dim stRank(7) As String, stTabl(40, 2) As String '40 строк в переменной я беру с запасом - параметр индивидуальный, а 3 столбца _
это ID, ФИО и должность, взятые из списка
With Me.MSHFlexGrid1
'узнаем, сколько всего в списке вместе с добавленным, и, если больше одного, то продолжаем далее:
intRows = .Rows
     If intRows = 1 Then Exit Sub
'заполняем массив чинами, в соответствии с которым будет упорядочиваться список. Если должностей слишком _
много, то легче перечислить их в отдельной таблице и заполнить открытием соответствующего Recordseta.
stRank(0) = "капитан"
stRank(1) = "старпом"
stRank(2) = "вахтенный рулевой"
stRank(3) = "радист"
stRank(4) = "боцман"
stRank(5) = "матрос"
stRank(6) = "кок"
stRank(7) = "пассажир"
' Начиная с последней строки MSHFlexGrid1все данные последовательно считываются в двухмерный массив stTabl в строгом _ соответствии порядку заполнения массива stRank. В данном примере до кока, чтобы пассажир был всегда последним. _
Если последний не обязателен, тогда For intTemp= 0 To 7 и пропустить последний блок Do While ... Loop
For intTemp = 0 To 6
     Do While intRows > 0
'проверяется на совпадение каждый 3 столбец MSHFlexGrid1 - должность. При совпадении проводится запись в массив stTabl
         If .TextArray((intRows - 1) * 3 + 2) = stRank(intTemp) Then
stTabl(intY, 2) = .TextArray((intRows - 1) * 3 + 2)
stTabl(intY, 1) = .TextArray((intRows - 1) * 3 + 1)
stTabl(intY, 0) = .TextArray((intRows - 1) * 3)
'после записи переводится строка в переменной-массиве
intY = intY + 1
         End If
'в MSHFlexGrid1перевод на строку вверх
     intRows = intRows - 1
     Loop
'восстанавливается первоначальное значение переменной для дальнейшего анализа MSHFlexGrid1
intRows = .Rows
Next
'в этом блоке выбираются должности, не вошедшие в основной список, т.е. неважно в каком они порядке, _
лишь бы были после основных
     Do While intRows > 0
         Select Case .TextArray((intRows - 1) * 3 + 2)
         Case stRank(0), stRank(1), stRank(2), stRank(3), stRank(4), stRank(5), stRank(6), stRank(7)
         Case Else
stTabl(intY, 2) = .TextArray((intRows - 1) * 3 + 2)
stTabl(intY, 1) = .TextArray((intRows - 1) * 3 + 1)
stTabl(intY, 0) = .TextArray((intRows - 1) * 3)
intY = intY + 1
         End Select
     intRows = intRows - 1
     Loop
intRows = .Rows
'если нужен последний (в данном случае - пассажир), то находим и его
     Do While intRows > 0
         If .TextArray((intRows - 1) * 3 + 2)=stRank(7) Then
stTabl(intY, 2) = .TextArray((intRows - 1) * 3 + 2)
stTabl(intY, 1) = .TextArray((intRows - 1) * 3 + 1)
stTabl(intY, 0) = .TextArray((intRows - 1) * 3)
intY = intY + 1
         End If
     intRows = intRows - 1
     Loop
'очищаем уже полностью переписанный в stTabl MSHFlexGrid1
.Clear
.Rows = 0
'заполняем его по новому уже упорядочено. intY - 1 потому, что ранее единица была добавлена, _
но запись в переменную по исчерпании списка не сделана
For intRows = 0 To intY - 1
.AddItem stTabl(intRows, 0) & vbTab & stTabl(intRows, 1) & vbTab & stTabl(intRows, 2)
Next
End With
End Sub

Игорь

 
     
  VBNet online (всего: 52050)  
 

Логин:

Пароль:

Регистрация, забыли пароль?


В чате сейчас человек
 
     
  VBNet рекомендует  
   
     
  Лучшие материалы  
 
ActiveX контролы (112)
Hitman74_Library (36119)
WindowsXPControls (20739)
FlexGridPlus (19374)
DSMAniGifControl (18295)
FreeButton (15157)
Примеры кода (546)
Parol (18027)
Passworder (9299)
Screen saver (7654)
Kerish AI (5817)
Folder_L (5768)
Статьи по VB (136)
Мое второе впечатление... (11236)
VB .NET: дорога в будущее (11161)
Основы SQL (9225)
Сообщения Windows в Vi... (8788)
Классовая теория прогр... (8619)
 
     
Техническая поддержка MTW-хостинг | © Copyright 2002-2011 VBNet.RU | Пишите нам