2016-06-01 6 views
0

Ich habe ein Listenfeld, das die ID-Nummer und das Modell einer Reihe von Autos enthält, die aus einer Zugangstabelle entnommen wurden. Ich habe einige Textfelder, die mit den Daten aus dieser Tabelle gefüllt werden, wenn ein Auto aus dem Listenfeld ausgewählt wird. Um die ID-Nummer des ausgewählten Autos, ich verwende diesen Code:Erhalten ein Zeichen aus einer Zeichenfolge eine unerwartete Zahl zurück?

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

, die das erste Zeichen in dem Itemstring bekommen sollte (es die ID-Nummer). Wenn ich das erste Element in der Liste auswähle, ist das, was ich bekomme, 49. Mein erster Gedanke war, dass ich es nicht zu einem int gewandelt habe, also repräsentiert die 49 vielleicht einen Zeichencode für die Nummer, jedoch

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

Gibt die exakt gleiche Nummer zurück. Der zweite Punkt ist 50 und so weiter und so fort.

Ich möchte ändern, wie ich die ID-Nummer von dieser Char-Konvertierung sowieso bekommen, wie es mir gerade eingefallen ist, dass wenn ich 10 Autos treffe, es nicht funktioniert, aber warum bekomme ich einen so großen, durchweg Offset , und (vielleicht am verwirrendsten von allen) mehrstellige Zahl von aC# Entsprechung von charAt[0] von Java?

Der spezifische Fehler, den ich bekommen habe ist, dass there is no row at position 49, die erscheint, wenn ich versuche, den Wert mydataset.Tables["mytable"].Rows[idNum]["CarID"].ToString(); zu erhalten. Jetzt kann ich ein paar Dinge sehen, die dieses Problem verursachen könnten, ich habe absolut Ahnung, wenn Rows[idNum]["CarID"] die richtige Syntax ist, und war sehr überrascht zu sehen, dass meine Vermutung funktioniert hat, aber es ist immer noch ein sehr seltsames Problem.

Antwort

1

Sie müssen den numerischen Wert für Char erhalten:

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

Während int idNum = listBox1.SelectedItem.ToString()[0]); Rückkehr der ASCII Charakter '1' (Beispiel), die 49 ist.

Dies ist der eigentliche Code von Microsoft für Convert.ToInt16:

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

Convert.ToInt16 für eine char hat eine Explicit Umwandlung, die die ASCII für diesen Character Wert bekommt.

Für Bedienung mehrerer Ziffern:

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

int idNum2; 

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

Or Without mit 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

habe ich versucht und es funktionierte. Ich habe mit 'int idNum = (int) Char.GetNumericValue (listBox1.SelectedItem.ToString() [0]) - 1; 'abgeschlossen, obwohl ich verwirrt bin, warum dies funktioniert, aber' Convert.ToInt16' nicht. Oder wandelt das nur den ASCII-Wert des Zeichens in ein int/nicht umwandeln, da ASCII-Werte bereits ints sind? –

+1

@SpaceOsstrich Ich denke, wenn Sie die 'Convert' anstelle von Parsing verwenden -' Convert' ist wahrscheinlich nur in diesem Fall eine Umwandlung, während ein 'Int16.Parse' tatsächlich die Zeichenfolge/char analysiert und den numerischen Wert zurückgibt. – Abbath

+1

@SpaceOstrich überprüfen Sie die bearbeitete Antwort, ich fügte den tatsächlichen Code von Microsoft hinzu. – user3185569

1

Versuchen Sie, diese

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

weil

listBox1.SelectedItem.ToString() [0] return Char. Wenn Sie Daten vom Typ Char in Integer konvertieren, wird ASCII von Char zurückgegeben. So konvertieren Sie es in Zeichenfolge vor dem Konvertieren in Ganzzahl (listBox1.SelectedItem.ToString() [0].ToString()).

0

user3185569 identifiziert das Problem, aber ich werde die Lösung aufstellen, die ich für zukünftige Referenz verwendet. Die int idNum = listBox1.SelectedItem.ToString()[0]); Zeile erhielt die ASCII für das Zeichen, 49 für 1, 50 für 2 usw. Dies kann mit (int)Char.GetNumericValue(listBox1.SelectedItem.ToString()[0]) -1; gelöst werden.

(int)Char.GetNumericValue erhält den tatsächlichen Zahlenwert dieses Zeichens anstelle des Werts ASCII. Die - 1 ist für die Auto-IDs von 1 beginnend, aber die Tabellenindizes beginnen von 0.

Dies bleibt immer noch die Frage der Ziffern, wenn das erste Zeichen der Zeichenfolge verwendet wird, um die ID-Nummer zu erhalten sobald es mehr als 9 Autos gibt, wird der Code nicht funktionieren. Die Zeichenfolgen werden in die Listbox als geschrieben. Zum Beispiel: 1: Astra. Um die ID-Nummer zu erhalten, habe ich Split(':')[0] verwendet, die die Zeichenfolge in ein Array von Teilstrings teilt und auf jedes : Zeichen aufteilt.

Die Arbeitscodezeile ist:

int idNum = Convert.ToInt16(listBox1.SelectedItem.ToString().Split(':')[0]) - 1; 
Verwandte Themen