今天某位網友在使用Menu控制項時碰到一個例外訊息:

Can't select a disabled or unselectable menu item
(無法選取停用的或無法選取的功能表項目)

 

案發現場大概是這樣的:這位朋友在MenuItemClick的時候,把選取到的MenuItem.Selectable設為false,然後再選另一個MenuItem,這個時候就會拋出這個例外了。

由於之前用TreeView的時候有遇過某個Node的Value重複,而浪費了許多時間在Debug的經驗。所以直覺就認為:MenuItem的Value有重複。經過測試後,的確,MenuItem的Value只要重複就會造成這種錯誤。

<asp:Menu ID="Menu1" runat="server" onmenuitemclick="Menu1_MenuItemClick">
    <Items>
        <asp:MenuItem Text="新增項目1" Value="1"></asp:MenuItem>
        <asp:MenuItem Text="新增項目1" Value="1"></asp:MenuItem>
        <asp:MenuItem Text="新增項目2" Value="2"></asp:MenuItem>
    </Items>
</asp:Menu>

 


protected void Menu1_MenuItemClick(object sender, MenuEventArgs e) {
    e.Item.Selectable = false;
}

 

只要這樣寫,點個幾下就會跳錯誤了。 

menu-selectable_false

 

 

 

 

 

不過這位朋友似乎不認為這是主因,於是我又追了一下。這才發現原來還有另一個情況會報錯,就是在程式碼裡面新增MenuItem。簡化之後的程式碼大致上如下: 


<asp:Menu ID="Menu1" runat="server" onmenuitemclick="Menu1_MenuItemClick">
    
</asp:Menu>

 


protected void Page_Load(object sender, EventArgs e) {
    if (!IsPostBack) {
        Menu1.Items.Add(new MenuItem("新項目1", "1"));
        Menu1.Items.Add(new MenuItem("新項目2", "2"));
        Menu1.Items.Add(new MenuItem("新項目3", "3"));
    }
}
 
protected void Menu1_MenuItemClick(object sender, MenuEventArgs e) {
    e.Item.Selectable = false;
}

 這樣寫即使MenuItem的Value沒重複也一樣會跳錯誤

 

 

 

會錯誤的原因是在於時間點,因為PageLoad是在LoadViewState之後,而Menu控制項會在LoadViewState的時候重新建立子節點(包括SelectedItem),所以此時如果已經有某一個節點已經被設為Selectable = false的話,就會出現這個錯誤訊息。

 

解決方式還蠻簡單的,直接設定e.Item.Selected = false就行了。 


protected void Menu1_MenuItemClick(object sender, MenuEventArgs e) {
    e.Item.Selectable = false;
    e.Item.Selected = false;
}

 

 

 

[結論] 

使用Menu控制項時,得注意以下二點: 

1.Value不要重複
2.如果程式內會設定Selectable的話,得連同Selected一起設定

arrow
arrow
    全站熱搜
    創作者介紹

    AnferneeHardaway 發表在 痞客邦 留言(0) 人氣()