【问题标题】:How to delete multiple checked items in a ListView?如何删除 ListView 中的多个选中项?
【发布时间】:2013-09-24 20:17:28
【问题描述】:
protected void btndelete_Click(object sender, EventArgs e)
{
    DataTable dt = new DataTable();

    for (int i = 0; i < listview1.Items.Count; i++)
    {
        ListViewDataItem items = listview1.Items[i];
        CheckBox chkBox = (CheckBox)items.FindControl("chkdel");

        if (chkBox.Checked == true)
        {
            if (Session["CurrentTable"] != null)
            {
                dt = (DataTable)Session["CurrentTable"];
                dt.Rows.RemoveAt(i);
            }
        }
        else
        {
        }
    }

    Session["CurrentTable"] = dt;
    listview1.DataSource = dt;
    listview1.DataBind();
    BindDataToGridviewDropdownlist();     
}

这里只删除一行。如何删除列表视图中的多个选中项?

【问题讨论】:

  • 删除项目后您没有调整索引。
  • 为什么总是从 Session dt = (DataTable)Session["CurrentTable"];
  • 在加载时我想显示空行,这就是我参加会议的原因
  • 你能告诉我如何调整我的指数 - 格兰特托马斯

标签: c# asp.net listview checkbox


【解决方案1】:

正如上面的 Hans Derks 在评论中提到的,您每次都从会话中获取数据表,但实际上并未使用 Session["CurrentTable"]=dt; 更新它,例如:

protected void btndelete_Click(object sender, EventArgs e)
{
    DataTable dt = new DataTable();

    for (int i = 0; i < listview1.Items.Count; i++)
    {
        ListViewDataItem items = listview1.Items[i];
        CheckBox chkBox = (CheckBox)items.FindControl("chkdel");

        if (chkBox.Checked == true)
        {
            if (Session["CurrentTable"] != null)
            {
                dt = (DataTable)Session["CurrentTable"];
                dt.Rows.RemoveAt(i);
                Session["CurrentTable"]=dt;
                listview1.DataSource = dt;
                listview1.DataBind();
            }
        }
        else
        {
        }
    }

    BindDataToGridviewDropdownlist();     
}

【讨论】:

  • 这个答案不会删除多个选中的行
  • dt.Rows.RemoveAt(i);位置 3(Indexoutofrange) 处没有行
  • 哦,我从会话数据表中删除了值,但没有从列表视图中删除。所以列表视图的计数更多,因此 Indexoutofrange 错误。还需要从列表视图中删除它
  • ya ...你能建议我吗?Plz ..Improve your answer
  • @Kailas,更新答案,将 listview 更新代码移入循环
【解决方案2】:

Pranav 答案的重构版本:

protected void btndelete_Click(object sender, EventArgs e)
{
    // Get the Table from the session.
    DataTable dt = (DataTable)Session["CurrentTable"];
    // Only actually proceed, if we have a value.
    if(dt != null)
    {
        // Loop through each item.
        for (int i = 0; i < listview1.Items.Count - 1; i++)
        {
            // Find the checkbox to determine if it's checked.
            ListViewDataItem items = listview1.Items[i];
            CheckBox chkBox = (CheckBox)items.FindControl("chkdel");
            if (chkBox.Checked == true)
            {
                // Remove the row at the current index.
                dt.rows.RemoveAt(i);
            }
        }
        // Update the session and rebind the data.
        Session["CurrentTable"] = dt;
        listview1.DataSource = dt;
        listview1.DataBind();
        BindDataToGridviewDropdownlist(); 
    }
}

【讨论】:

  • 同样的错误 dt.Rows.RemoveAt(i);位置 3(Indexoutofrange) 处没有行
  • 为此,当我选择单个复选框时,它正在删除,但是当我选择 2 个复选框时 ....它显示错误
  • 啊,我刚刚纠正了我的答案,因为计数是基于 1 的,而 Items 数组是基于 0 的。
  • 这里是删除 3 行选择中的 2 行
  • 非常感谢您的帮助......终于我明白了
【解决方案3】:

这对我有用.....

protected void btndelete_Click(object sender, EventArgs e)
        {
            DataTable dt = new DataTable();
            if (Session["CurrentTable"] != null)
            {
                dt = (DataTable)Session["CurrentTable"];
                int j = 0;
                for (int i = 0; i < listview1.Items.Count; i++)
                {
                    ListViewDataItem items = listview1.Items[i];
                    CheckBox chkBox = (CheckBox)items.FindControl("chkdel");

                    if (chkBox.Checked == true)
                    {
                        dt.Rows.RemoveAt(j);
                        dt.AcceptChanges();
                    }
                    else
                    {
                        j++;
                    }
                }
                Session["CurrentTable"] = dt;
                listview1.DataSource = dt;
                listview1.DataBind();
                BindDataToGridviewDropdownlist();
            }
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多