2017-05-30 115 views
1

我有一個項目列表視圖,其中用戶一次只能選擇一個。我有下面的代碼,只有當我把它放在try/catch塊中才能正常工作。問題是,某些項目名稱太長,並且會爲其他項目產生大量空白區域。點擊空格將導致ArgumentOutOfRangeException,即使它與某個項目位於同一行。我通過將它放在try/catch塊中解決了這個問題,但我認爲這是一種骯髒的方法,即使它可行。以下是代碼。ListView項目選擇和異常處理

private void listView1_DoubleClick(object sender, EventArgs e) 
{ 
    try 
    { 
     string[] arr1 = File.ReadAllLines(listView1.SelectedItems[0].Tag.ToString()); 
     string[] arr2 = arr1[0].Split(';'); 
    } 
    catch 
    { 
     //no catch 
    } 
} 

我想完全避免這種情況,但我不知道如何更改代碼,使其沒有的try/catch工作。我試過if(!String.IsNullOrEmpty),但它仍然不起作用。這裏有什麼解決方案?

+1

當您應該測試listView1.SelectedItems.Count時不要使用try!這是一個正常的情況。也不要把這麼多的命令堆成一行;難以調試,並在添加檢查的方式.. – TaW

+0

底層的問題是,雖然,我想使用戶總是選擇該項目所在的行,無論他點擊,名稱或空白處。 – EInherjar

+0

是的,的確如此,但我的建議仍然適用!你使用哪種視圖模式? – TaW

回答

3

由於您的ListViewView=List選擇使得它有必要擊中項目文本。

這是不方便的,我不得不承認,FullRowSelect turnnig沒有幫助,因爲它只是爲View=Details

這裏是一個快速的解決辦法:

private void listView1_MouseDoubleClick(object sender, MouseEventArgs e) 
{ 
    var hit = listView1.HitTest(e.Location); 
    if (hit.Item != null) 
    { 
     string file = hit.Item.Text; 
     string[] arr1 = null; 
     if (File.Exists(file)) arr1 = File.ReadLines(file).ToArray(); 
     ... 
    } 
} 

很可能,你要到問題的底部和代碼添加到MouseUp事件選擇行..:

private void listView1_MouseUp(object sender, MouseEventArgs e) 
{ 
    var hit = listView1.HitTest(e.Location); 
    if (hit.Item != null) hit.Item.Selected = true; 
} 

請注意,HitTest將只捕獲Items,空或不,真正emtpy背景空間的權利或底部..!