2016-10-09 26 views
1

私は、System.IOドライブ(C:\、D:\など)で自動的に入力されるcmbPlace(コンボボックス)を持っています。検証中のイベントもあります。以下のコードは:私は、検証errormessage1と入力「ヌル」または「ないインデックスで」テキストのようcmbPlace.Focusを()をテストしようとしたときc#InvalidArgument =値 '-1'は 'index'には無効

using System.IO; 
public FNamefile() 
{ 
    InitializeComponent(); 
    DriveInfo[] allDrives = DriveInfo.GetDrives(); 
    foreach (DriveInfo d in allDrives) 
    { 
     cmbPlace.Items.Add(d.Name); 
    } 
} 

private void FNamefile_Load(object sender, EventArgs e) 
{ 
    errorProvider1.ContainerControl = this; 
} 

private bool ValidatePlace() 
{ 
    bool bStatus = true; 
    int m = cmbPlace.SelectedIndex; 
    if ((cmbPlace.Items[m]).ToString() == cmbPlace.Text) 
    { 
     errorProvider1.SetError(cmbPlace, ""); 
    } 
    else if (cmbPlace.Text == "" || (cmbPlace.Items[m]).ToString() != cmbPlace.Text) 
    { 
     errorProvider1.SetError(cmbPlace, "Please enter a valid location"); 
     bStatus = false; 
    } 
    return bStatus; 
} 
private void cmbPlace_Validating(object sender, CancelEventArgs e) 
{ 
    ValidatePlace(); 
    int m = cmbPlace.SelectedIndex; 

    if ((cmbPlace.Items[m]).ToString() == cmbPlace.Text) 
    { } 
    else 
    { 
     cmbPlace.Focus(); 
    } 
} 

問題があり、彼らはトリガされませんし、ショーのエラー

InvalidArgument = '-1'の値は 'index'には無効です。パラメータ名:インデックスここ

にはアイテムがSelectedIndexプロパティが選択されていない行/ ValidatePlaceで、エラーの原因となるコードとcmbPlace_Validating

if ((cmbPlace.Items[m]).ToString() == cmbPlace.Text) 
+0

負の値を持つ配列から値を取得または取得しようとしているようです。それは不可能です。配列は常に0から始まります。 – VDWWD

+1

何も選択されていない場合、 'SelectedIndex'は-1です。 'if(cmbPlace.SelectedIndex> = 0)'で確認する必要があります。 – user3185569

+0

@ user3185569うわー、うまくいきました、ありがとう! –

答えて

2

私はコメントで掲示として、だ-1を返しますしていますインデックスで配列要素にアクセスするための無効なインデックス(cmbPlace.Items[m]を使用)それは、選択した要素にアクセスする前に確認する必要があります。

if(cmbPlace.SelectedIndex >= 0) 
{ 
    // do something 
} 
else 
{ 
    // No item selected, handle that or return 
} 
関連する問題