2016-06-16 4 views
1

私はプロジェクトに取り組んでおり、私はC#でのプログラミングの初心者です。何とか解決できない問題があります。どのように起こったのですか:コードを実行すると、アプリケーションは正常に起動しますが、例外 は、「インデックスが配列の境界外にある」ことを示しています。その後、リストボックスの項目をクリックすると、テキストボックスに2番目のオブジェクトが表示されます。だから...(リストボックスの項目をクリックして)動作しているようだが、なぜ配列に関して例外がスローされるのかわからない。 Beneathは現在のコードです。エラー:(Listクラスを使用して)インデックスが配列の境界外にありました

**アップデート:心からお詫び申し上げます。間違ったコードをアップロードしました。このコードすると仮定されています

はコード:

struct studentInfo 
{ 
    public string studentID; 
    public string major; 
} 

public partial class Form1 : Form 
{ 
    private List<studentInfo> studentList = new List<studentInfo>(); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 


    private void ReadInputFile() 
    { 
     try 
     { 
      StreamReader inputFile; 
      string line = ""; 

      studentInfo student = new studentInfo(); 

      char[] delimiter = { ',' }; 

      inputFile = File.OpenText("Student Info.txt"); 

      while (!inputFile.EndOfStream) 
      { 
       line = inputFile.ReadLine(); 

       string[] token = line.Split(delimiter); 

       student.studentID = token[0]; 
       student.major = token[1]; 

       studentList.Add(student); 

      } 

     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
    private void DisplaystudentID() 
    { 
     foreach (studentInfo student in studentList) 
     { 
      studentInfoListBox.Items.Add(student.studentID); 
     } 
    } 

    private void DisplayNames() 
    { 

    } 
    private void button1_Click(object sender, EventArgs e) 
    { 
     ReadInputFile(); 

     DisplaystudentID(); 
    } 

    private void studentInfoListBox_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     int index = studentInfoListBox.SelectedIndex; 

     majorTextBox.Text = studentList[index].major; 


    } 

    private void button3_Click(object sender, EventArgs e) 
    { 
     Application.Exit(); 
    } 
} 
+0

たライン上では、その例外をスローし、例外の正確なタイプとメッセージは何であるのか? –

+0

おそらく、行の1つにカンマがありませんか?例えば、ファイルの最後の行は、* textとの最後の行ですか、あるいはそこに空白行がありますか? –

+0

こんにちは!例外をスローする行はcatch文でした。 MessageBoxを使ったcatchステートメント例外のメッセージには、「ネイティブ式がコールスタックの上にあるため式を評価できません」というように記述されています。 –

答えて

2

あなたがコントロールが最初にSelectedIndexをが私の推測では、ということでしょう-1

private void nameListBox_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if(nameListBox.SelectedIndex >=0) 
    { 
     int index = nameListBox.SelectedIndex; 

     phoneLabel.Text = phoneList[index].phone; 
    } 
} 
+0

これは実際に動作します〜ありがとう、ハリ〜 –

+0

問題ありません。これがあなたを助けてくれてうれしいです。 –

+0

'nameListBox.SelectedIndex == -1'は、* no items *が選択されているときの典型的なものです。 –

3

に設定されて作成されたとき、SelectedIndexを守るために持っているのSelectedIndexChanged (あなたが何かを選択する前に)最初に実行され、その時点でnameListBox.SelectedIndexは-1になり、リスト内で「負の1の位置の項目」を取得することはできません。選択したインデックスが有効であることを確認します。

https://msdn.microsoft.com/fr-fr/library/system.windows.forms.listbox.selectedindex(v=vs.110).aspx "現在選択されているアイテムの0から始まるインデックスです。アイテムが選択されていない場合は-1の値が返されます。"

私は、次のようなコードを変更します

private void nameListBox_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    int index = nameListBox.SelectedIndex; 
    if(index !=-1) 
    { 
     phoneLabel.Text = phoneList[index].phone; 
    } 
    // else do nothing, the selected item didn't really change, it's just called for the first time, think of it as the control saying "hey i just got created and i'm notifying you that the selected item is now nothing" 
} 
+0

ありがとう、ロナン〜私はこの論理がどのように働くのか見ています。私はC#の私のプログラミング教育の一環としてこれをメモします。 :D –

1

あなたのプログラムを持っているの取り扱いのみのアレイはこれです:

entry.name = tokens[0]; 
entry.phone = tokens[1]; 

したがってその理由は、あなたのテキストの行の1ファイルにカンマがないため、tokensには2つの部分がありません。

一般的な理由は、最後にの実番号のエントリの後に改行が付いているファイルがあるため、最後の行が空の行になります。

私は単にここにこれを処理します:

if (tokens.Length < 2) 
    continue; 
1

をあなたは例外が発生している場所を正確に私たちに知らせていなかったが、私は見るように、あなたの場合は、この部分に

line = inputFile.ReadLine(); 

string[] tokens = line.Split(delim); 

entry.name = tokens[0]; 
entry.phone = tokens[1]; 

かもしれません行が空であるか、 "、"がない場合、次の行に例外が表示されます

また、indexの場所のリストへのアクセスを確認する必要がありますnameListBox_SelectedIndexChanged

0

"インデックスが配列の境界外でした"例外は、リスト内に存在しない要素にアクセスしようとすると発生します。私はあなたがリストの最後の項目をクリックしているときにこの例外を取得していると信じています。

nameListBox_SelectedIndexChangedメソッドには、次のいずれかがあります。

int index = nameListBox.SelectedIndex -1; 

または

phoneLabel.Text = phoneList[index-1].phone; 
関連する問題