复选框列出linq的状态

时间:2015-09-18 17:31:19

标签: c# asp.net linq

考虑这种情况,您希望在checkboxlist中检索List或IEnumerable中所有未选中复选框的值。这段代码给了我所有已检查(现在)或(之前)的值。如何使用linq获取unchecked(now)和(之前)的值。谢谢

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 );

 }

1 个答案:

答案 0 :(得分:0)

基于你评论: 让我们说你有aspx页面加载你拥有的所有应用程序(从活动目录,数据库或其他),然后分配当前用户拥有的所有应用程序(也从任何时候获取这些应用程序).​​.所以在你的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;
}

所以到目前为止,用户将能够检查,取消选中他想要的内容。所以你的复选框列表AutoPostBack = False

所以当他完成编辑时,假设他会将其提交给服务器,这样他就会有一个提交按钮(假设它的ID是&#34; btnSave&#34;

 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提高性能

更好