2013-11-20 3 views
0

У меня есть вопрос относительно Наримера в vb.net 2010VB.NET -> выпадающего случайный индекс

В моей базе данных у меня есть 4 поля: например:

idDetails | DetailsShortCode | Details_Explain | DetailsSortOrder 
{autonum}1| DOA    | Death on Arrival| 5 
{autonum}2| NDI    | No Display  | 10 
{autonum}3| QQA    | In Research  | 4 

и т.д ..

Эти значения я вытаскиваю из dbase (mySQL) и вставляю в CheckedListBox. Я отображаю значения как DetailsShortCode & "-" & Details_explain. Я использую [для цикла] для создания индексных чисел, потому что порядок сортировки основан на порядке сортировки деталей. Это означает, что VB.net получает «кормят» с результатами в следующем порядке:

idDetails | DetailsShortCode | Details_Explain | DetailsSortOrder 
3   | QQA    | " ... "   | 4 
1   | DOA    | "...."   | 5 
2   | NDI    | " ... "   | 10 

Если я положил это в ListBox, ошибка Получу является «3 неправильное значение„индекса“» в связи с тем, что VB.net ожидает, что CheckedListBox (а также ComboBox) индекс всегда находится в последовательном порядке, как и в 0,1,2,3,4..etc ..

проблема заключается в факт, что заказы в базе данных могут меняться, элементы могут меняться, и у меня есть поле в другой таблице, содержащей список, выделенный запятыми, выбранных деталей (например, 1; 10; 14; 12;) Это означает, что 1 всегда должно быть элемент с Prim aryKey 1, и что отображаемый элемент в этом индексе всегда должен быть одним и тем же ...

так что мне нужно знать, как я могу использовать Первичный ключ как индексный номер, и пусть VB.Net не бросает ошибка когда индекс в случайном порядке .., или дать вещи скрытое значение (например, в HTML и PHP), в котором я могу просто использовать [для цикла] индексов ..


Это это код я использую для вставки элементов в детали CheckedListBox

Function LoadComboBoxes(ByVal CB As String) 
    Dim SQLtext = "" 
    Select Case CB 
     Case "Details" 
      SQLtext = "Select " & _ 
         "idDetails, " & _ 
         "DetailsCode, " & _ 
         "DetailsExplain, " & _ 
         "DetailsSortOrder " & _ 
         "FROM Details order by DetailsSortOrder" 
Dim i = -1 
    Dim dr As MySqlDataReader 

    Dim cmd As New MySqlCommand(SQLtext, dbconn) 
    connect() 
    dr = cmd.ExecuteReader(CommandBehavior.CloseConnection) 

    CLBDetails.Items.Clear() 
    While dr.Read 
     i += 1 
     CLBDetails.Items.Insert(i, .GetString(1) & " - " & dr.GetString(2)) 
    End While 

end select 
end function 
+0

Откуда взялся 'CheckedComboBox'? ты его написал? – Plutonix

+0

Показать код, в который вы вставляете элементы в список. Я уверен, что вам не нужен индекс, чтобы вставить что-нибудь. Простое добавление (добавление к концу) или привязка к списку должно быть достаточным. Кроме того, обычные элементы списка имеют свойство Tag для хранения объекта. –

+0

CheckedComboBox на самом деле CheckedListBox (пожалуйста, извините, что я перепутал). У меня эта проблема с обычными ComboBoxes тоже, но кроме того факта, что этим не нужно поддерживать несколько выборов, последовательность отображения должна быть основана на пользователе .., поэтому проблема все та же, индекс # запутан -up .. – Fimlore

ответ

0

Самый простой способ может быть использование DataGridVie w, который должен обладать всеми функциональными возможностями CheckedComboBox, а также возможностью хранить данные без изменений в качестве данных столбца и позволять ссылаться на столбец идентификатора как идентификационную колонку, а не на идентификатор, называемый индексом.

В зависимости от того, что CheckedComboBox есть (есть много их вокруг) и то, что он наследует от, вы должны быть в состоянии хранить объекты там:

Class DisplayItem 
    Friend ID as Long 

    DetailsShortCode As String 

    Details_Explain As String 
    DetailsSortOrder As String 

    Public Function overrides ToString As String 
     ' depending on the CheckedComboBox add column seperators? 
     return DetailsShortCode & Details_Explain & DetailsSortOrder 
    End Function 
End Class 

Добавление объекта, такого как это управление позволяет вы сохраняете PK ref:

ccb.Items(N).ID 

В то время как функция ToString позволяет отформатировать выходной сигнал по желанию. Кроме того, вы можете создать List (Of DisplayItem) или BindingList (Of DisplayItem) и диск CheckedComboBox путем привязки источника данных к списку. A DGV все еще проще ...

+0

Я имел в виду CheckedListBox, который является стандартным объектом в VB.Net, я должен использовать его, потому что мне нужно, чтобы пользователь определял разные «детали» об объекте. Проблема с DataGridView (я на самом деле только что узнал об этих 20 дней назад ..) есть то, что есть функция, которая «проверяет» элементы в DGV .. не так ли? – Fimlore

+0

Да, вы можете определить столбец как флажок (или изображение или ... много вещей) – Plutonix

+0

ok, это может решить проблему с CheckedListBox .. Но это не решит мою проблему с ComboBoxes (что то же самое проблема, порядок сортировки изменится, поэтому индекс # войдет в случайном порядке). Могу ли я использовать dataReader в качестве источника данных для Combobox? Будет ли он использовать primaryKey в качестве индекса #? – Fimlore

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