2016-06-01 4 views
0

У меня есть окно списка, которое содержит идентификационный номер и модель ряда автомобилей, взятых из таблицы доступа. У меня есть некоторые текстовые поля, которые будут заполнены данными из этой таблицы, когда автомобиль будет выбран из списка. Чтобы получить идентификатор выбранного автомобиля, я использую этот код:Получение символа из строки возвращает неожиданный номер?

int idNum = listBox1.SelectedItem.ToString()[0]; 

Который должен получить первый символ в строке элемента (это идентификационный номер). Когда я выбираю первый элемент в списке, то я вместо этого получаю 49. Моя первая мысль заключалась в том, что я не добавлял его в int, поэтому, возможно, 49 представляет собой некоторый код символа для номера, однако

Convert.ToInt16(listBox1.SelectedItem.ToString()[0])

Возвращает точно такой же номер. Второй элемент - 50, и так далее и т. Д.

Я хочу изменить способ получения идентификационного номера из этого преобразования символов, так как мне просто пришло в голову, что как только я нажму 10 автомобилей, это не сработает, но почему я получаю такое большое, неизменно смещенное , и (возможно, самый непонятный из всех) многозначный номер от aC# эквивалент java charAt[0]?

Специфическая ошибка, которую я получаю, заключается в том, что there is no row at position 49, который появляется, когда я пытаюсь получить значение mydataset.Tables["mytable"].Rows[idNum]["CarID"].ToString();. Теперь я вижу несколько вещей, которые могут вызвать эту проблему, я абсолютно знаю идею, если Rows[idNum]["CarID"] является правильным синтаксисом, и был очень удивлен, увидев, что мое предположение работает, но это все еще очень странная проблема.

ответ

1

Вы должны получить числовое значение для Char:

int idNum = (int)Char.GetNumericValue(listBox1.SelectedItem.ToString()[0]); 

Хотя int idNum = listBox1.SelectedItem.ToString()[0]); возвращают ASCII Характера '1' (пример), который 49.

Это фактический код из Microsoft для Convert.ToInt16:

public static short ToInt16(char value) 
{ 
    // Some validations 
    return (short)value; 
} 

Convert.ToInt16 для char делает Explicit преобразования, который получает ASCII для этого Character Value.

Для обработки нескольких цифр:

string str = "37abcdef"; 
string myStrNumber = Regex.Match(str, @"\d+").Value; 

int idNum2; 

if (myStrNumber.Length > 0) 
    idNum2 = Convert.ToInt32(myStrNumber); 
else 
{ 
    // Handle Error 
} 

или без использования Regex:

string str = "37abcdef"; 
string myStrNumber = ""; 

for(int i = 0; i < str.Length; i++) 
{ 
    if (Char.IsNumber(str[i])) 
     myStrNumber += str[i]; 
} 

int idNum2; 

if (myStrNumber.Length > 0) 
    idNum2 = Convert.ToInt32(myStrNumber); 
else 
{ 
    // Handle Error 
} 
+0

Я попробовал, и это сработало. Я закончил с помощью 'int idNum = (int) Char.GetNumericValue (listBox1.SelectedItem.ToString() [0]) - 1;', хотя я смущен, почему это работает, но 'Convert.ToInt16' не делает. Или это просто преобразование значения ASCII символа в int/не преобразование чего-либо, поскольку значения ASCII уже являются ints? –

+1

@SpaceOstrich Я думаю, что когда вы используете 'Convert' вместо синтаксического анализа -' Convert', возможно, просто делает приведение в этом случае, тогда как 'Int16.Parse' будет фактически анализировать строку/char и возвращать числовое значение. – Abbath

+1

@SpaceOstrich проверяет отредактированный ответ, я добавил фактический код из microsoft. – user3185569

1

Попробуйте

int idNum = Convert.ToInt16(listBox1.SelectedItem.ToString()[0].ToString()) 

потому что

listBox1.SelectedItem.ToString() [0] return Char. Если вы преобразуете данные типа Char в Integer, он вернет ASCII символа Char. Итак, преобразуйте его в строку перед преобразованием в Integer (listBox1.SelectedItem.ToString() [0] .ToString()).

0

user3185569 определил проблему, но я поставлю решение, которое я использовал для использования в будущем. Линия int idNum = listBox1.SelectedItem.ToString()[0]); получала ASCII для персонажа, 49 для 1, 50 для 2 и т. Д. Это можно решить, используя (int)Char.GetNumericValue(listBox1.SelectedItem.ToString()[0]) -1;.

(int)Char.GetNumericValue получает фактическое числовое значение этого символа, а не значение ASCII. - 1 должен учитывать идентификатор автомобиля, начинающийся с 1, но индексы таблицы начинаются с 0.

Это все еще оставляет проблему цифр, если первый символ строки используется для получения идентификационного номера, так как скоро, когда будет более 9 автомобилей, код не будет работать. Строки записываются в списке как "[idNum]: [carName]". Например: 1: Astra. Чтобы получить идентификационный номер, я использовал Split(':')[0], который разбивает строку на массив подстрок, разделяя на каждый символ :.

Рабочая строка кода:

int idNum = Convert.ToInt16(listBox1.SelectedItem.ToString().Split(':')[0]) - 1; 
Смежные вопросы