2015-09-18 3 views
0

Рассмотрите этот сценарий, в котором вы хотите получить список или IEnumerable значений всех отмеченных флажков в checkboxlist. этот код дает мне значение всех отмеченных (сейчас) или (ранее). как я могу получить значения unchecked (сейчас) и (ранее) с linq. спасибостатус списка флажков с помощью linq

private IEnumerable <string > selectedValues 
    { 
     get 
     { 
    if (ViewState ["selectedValues"] == null && chapp . SelectedIndex >=-1) 
    { 
     ViewState ["selectedValues"]= chapp .Items.Cast <ListItem >() 
      .Where (li=>li.Selected) 
      .Select (li=>li.Value) 
      .ToList(); 
    }else 
     ViewState ["selectedValues"]= Enumerable .Empty <string >(); 
      return (IEnumerable <string >)ViewState ["selectedValues"]; 
     } 
     set {ViewState ["selectedValues"] = value ;} 
     } 
protected void chapp_SelectedIndexChanged(Object sender, EventArgs e) 
{ 
    CheckBoxList c = (CheckBoxList)sender; 

    var oldselection = this.selectedValues; 
    var newSelection = c.Items.Cast<ListItem>() 
       .Where(li => li.Selected ) 
       .Select(li => li.Value); 
    var unchangedItems = newSelection.Except(oldselection); 

} 

ответ

0

Основываясь на вас комментарии: Давайте предположим, что у вас есть страница ASPX, которая загрузить все приложения, которые имеют (от активной директории, DB или любой другой), после того, что назначение всех приложений, которые текущий пользователь имеют (также получать эти приложения от того, что когда-либо) ... так что в вашем Page_Load вы будете иметь что-то, как показано ниже:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     //Load all applications 
     var apps = loadAllApplications(); 
     //Load user applications 
     var myApps = loadUserApplications(); 

     //Bind to checkboxlist, assuming my checkboxlist ID "chksApps" 
     chksApps.DataSource = apps.Select(x => new ListItem 
     { 
      Value = x.Id.ToString(), 
      Text = x.Name, 
      Selected = myApps.Any(a => x.Id == a) 
     }); 
     chksApps.DataBind(); 
    } 
} 

//lets say I have a Application class like that 
public class Application 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

private List<int> loadUserApplications() 
{ 
    // if user already have "Paint", "Chrome" assigned 
    var myApps = new List<int>() { 2, 4 }; 
    return myApps; 
} 

private List<Application> loadAllApplications() 
{ 
    //for testing I will create a dummy list of applications 
    var applications = new List<Application>() { 
     new Application { Id = 1, Name = "Visual Studio" }, 
     new Application { Id = 2, Name = "Paint" }, 
     new Application { Id = 3, Name = "Notepad" }, 
     new Application { Id = 4, Name = "Chrome" } 
    }; 
    return applications; 
} 

так до сих пор пользователь сможет проверить, снимите то, что когда-либо он хочет. так что ваш CheckBoxList AutoPostBack = False

поэтому, когда он закончить редактирование, предполагая, что он представит, что на сервере, поэтому он будет иметь кнопку отправки (позволяет сказать, что это идентификатор «btnSave»

protected void btnSave_Click(object sender, EventArgs e) 
{ 
    //Load user applications 
    var myApps = loadUserApplications(); 

    //get selected Application 
    var selectedApps = chksApps.Items.Cast<ListItem>() 
          .Where(x => x.Selected) 
          .Select(x => int.Parse(x.Value)).ToList(); 

    // send request to owner to add those below apps for user "newSelectedApps" 
    var newSelectedApps = selectedApps.Except(myApps).ToList(); 

    // send request to owner to remove those below apps "newUnSelectedApps" 
    var newUnSelectedApps = myApps.Except(selectedApps).ToList(); 

    // those below are the unchanged apps "unChangedApps" 
    var unChangedApps = myApps.Intersect(selectedApps).ToList(); 
} 

это лучше, чем при использовании ViewState для выполнения

+0

Привет Sherif Ahmed, я получаю ERRO ниже: System.Runtime.Serialization.SerializationException: Le тип «System.Linq.Enumerable + WhereSelectEnumerableIterator'2 [[System.Web.UI.WebControls.ListItem, System.Web, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a], [System.String, mscorlib, Version = 2.0.0 .0, Culture = neutral, PublicKeyToken = b77a5c561934e089]] 'dans l'assembly' System.Core, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089 ' – Codes

+0

Эта ошибка появляется в var unSelectedChanged = oldUnSelected.Except (newUnSelected); второй – Codes

+0

проверить обновление –

Смежные вопросы