【问题标题】:How to Get Updates(changed Items) From CheckboxList?如何从 CheckboxList 获取更新(更改的项目)?
【发布时间】:2009-12-19 19:12:23
【问题描述】:

我的页面中有一个复选框列表,它的数据源在 PreLoad() 事件中以编程方式设置:

protected void Page_PreLoad()
{
        if (!Page.IsPostBack)
        {
        CheckBoxList1.DataSource = NoK.AcceptedNoks((Guid)Membership.GetUser().ProviderUserKey);
        CheckBoxList1.DataTextField = "FullName";
        CheckBoxList1.DataValueField = "NoKId";
        CheckBoxList1.DataBind();
        }
foreach (ListItem chk in CheckBoxList1.Items)
{
    if (PrivateMessage.HasAccess(Request.QueryString["MessageId"], chk.Value))
    {
        chk.Selected = true;
    }
}

}

正如您在 foreach 中看到的,将检查是否必须检查项目。而且效果很好。这意味着最终用户可以编辑列表项,并且默认情况下某些项已被选中。现在我想通过单击按钮来获取项目:

protected void UpdateRightBtn_Click(object sender, EventArgs e)
{
    var SelectedNokIds =
        CheckBoxList1.Items
        .OfType<ListItem>()
        .Where(li =>
            li.Selected == true)
            .Select(l => new Guid(l.Value));
}

SelectedNokIds 中的项目仍然是旧项目,如果用户更改复选框,SelectedNokIds 中的任何效果都不会出现。 为什么???

请帮忙!

【问题讨论】:

    标签: c# asp.net datasource checkboxlist listitem


    【解决方案1】:

    看起来是因为您在回发时再次重新设置了值,从而有效地清除了用户的选择。您只需要在不是回发时初始化值。

    【讨论】:

    • 感谢您的回答,但不幸的是,您在重新设置数据源的地方看不到所有内容。就在 PerLoad() 中。
    【解决方案2】:

    foreach (ListItem chk in CheckBoxList1.Items){ if (PrivateMessage.HasAccess(Request.QueryString["MessageId"], chk.Value)) { chk.Selected = true; }}

    此行在每次页面加载时触发,因此会重置选择(至少是那些将 selected 设置为 true 的选择)。那不应该在 !Page.IsPostback 内吗?在更新按钮中,您可以在那里重新绑定...

    如果您需要弄清楚发生了什么变化,您需要再次查询数据源中的项目,并将这些项目与新的选择列表交叉引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      • 2012-02-07
      • 1970-01-01
      相关资源
      最近更新 更多