2009-12-07 46 views
0

有沒有方法可以確定(在回發後)下拉列表中的值是否已動態添加或是其中一個初始值?查找下拉列表值是否動態添加

例如。

<asp:DropDownList ID="MyDDL" runat="server"> 
    <asp:ListItem>1</asp:ListItem> 
    <asp:ListItem>2</asp:ListItem> 
    <asp:ListItem>3</asp:ListItem> 
</asp:DropDownList> 

// on postback 1 
private void AddExtraItemToList() 
{ 
    if (someCondition) // extra items may or may not be inserted 
     MyDDL.Items.Add("17"); 
} 


// on postback 2 
private void RemoveExtraItemsFromList() 
{ 
    // remove any non-default values from the list... ? 
} 

這是obvioulsy微不足道在後面的代碼什麼的編碼默認值的列表做的,但它是整潔,如果你可以通過查詢該值分別爲INTIAL性能和從視圖狀態恢復產生做了以上。

+0

已經嘗試MyDDL.Items.Clear();然後添加您的默認值 – 2009-12-07 14:16:27

+0

Pandiya不回答問題。 .Clear會刪除所有項目。 – JonH 2009-12-07 14:25:52

回答

1

處理此問題的最佳方法是從一開始就跟蹤代碼中的原始值。

這是您的代碼的改編版本,通過將原件存儲在視圖狀態(您可以將它們存儲在任何地方)來完成此操作。訣竅是您必須在新建項目的任何動態插入之前拔出下拉菜單中的項目。

 public string[] OriginalDropDownValues 
     { 
      get 
      { 
       return ViewState["origValues"] as string[]; 
      } 
      set 
      { 
       ViewState.Add("origValues", value); 
      } 
     } 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      if (!Page.IsPostBack) 
      { 
       // get the values from the control and store them in viewstate 
       var oValues = new List<string>(); 
       foreach (ListItem item in MyDDL.Items) 
       { 
        oValues.Add(item.Value); 
       } 
       OriginalDropDownValues = oValues.ToArray(); 
      } 
     } 

     // on postback 2 
     private void RemoveExtraItemsFromList() 
     { 
      List<string> valuesToKill = new List<string>(); 
      var oItems = OriginalDropDownValues; 
      foreach (ListItem currentItem in MyDDL.Items) 
      { 
       if (!oItems.Contains(currentItem.Value)) 
       { 
        // can't remove items yet, would modify collection we are iterating through 
        valuesToKill.Add(currentItem.Value); 

       } 
      } 
      foreach (var killVal in valuesToKill)//loop kill values and locate+remove each from drop down. 
      { 
       MyDDL.Items.Remove(MyDDL.Items.FindByValue(killVal)); 
      } 
     } 
0
+0

這個問題沒有處理同樣的問題 - 要保留的問題是已知的(即第一個問題)。在這種情況下,需要有其他方法來確定要保留哪些項目以及要刪除哪些項目。 – 2009-12-07 14:44:32

1

你可以給列表中的項目基於他們是否是原來的項目或額外的項目相同的值。

<asp:DropDownList ID="MyDDL" runat="server"> 
    <asp:ListItem Value="A">1</asp:ListItem> 
    <asp:ListItem Value="A">2</asp:ListItem> 
    <asp:ListItem Value="A">3</asp:ListItem> 
</asp:DropDownList> 

private void AddExtraItemToList() { 
    if (someCondition) // extra items may or may not be inserted 
     MyDDL.Items.Add(new ListItem("17", "B"); 
} 

private void RemoveExtraItemsFromList() { 
    for (int x = MyDDL.Items.Count - 1; x > 0; --x) { 
     if MyDDL.Items[x].Value = "B" { 
      MyDDL.Items.RemoveAt(x); 
     } 
    } 
} 

對不起,如果有C#語法錯誤 - 我有點生疏,並從VB翻譯。

+0

+1,不錯的主意,但它仍然感覺有點哈克 – fearofawhackplanet 2009-12-07 16:06:24

+0

這是 - 不知道有一個簡單的非黑客的解決方案。顯然,如果你需要使用這個值,那麼這個解決方案根本就不起作用。 – 2009-12-07 16:27:53