如何动态删除DataList c#asp中的行

时间:2017-11-10 20:53:29

标签: c# asp.net datatable datalist

寻找一种从数据列表中动态删除行的方法,为用户提供一种“清理”其输入界面的方法。 asp datalist从SQL加载,然后用户可以在将表发送到另一个数据库之前对其进行操作。

我通过使用数据表会话变量来运行'addRows',向其添加行然后重新绑定到datalist,但是我似乎无法通过删除行来获得相同的功能。

当前逻辑是使用datalist'delRows'命令,从asp datalist获取当前输入或修改的数据,将其分配给数据表,循环通过datatable并删除某些字段为空的行,然后重新绑定数据表到asp datalist。

当前代码处理,但无法获取dt,错误“dt = null”:

        if (e.CommandName == "delRows")
        {                         
            DataList DataList1 = (DataList)FindControl("DataList1"); //find datalist in current state
            Session["dataList1"] = DataList1;  //assign datalist to session variable     
            DataTable dt = Session["dataList1"] as DataTable; //populate datatable with datalist session 

            for (int i = dt.Rows.Count - 1; i >= 0; i--)
            {
                DataRow dr = dt.Rows[i];
                string check = dr["item_no"].ToString();
                if (check == String.Empty)
                {
                    dr.Delete();
                }
            }

            DataList1.DataSource = dt;
            DataList1.DataBind();
        }

希望有更好的方法来实现这一目标!更不用说工作......

1 个答案:

答案 0 :(得分:0)

对于任何未来的信息搜索者:必须循环到表格以将最新的文本框文本转换为dt,然后在后面的代码中修改dt datatable,然后将dt重新绑定到datalist。

protected void doDataTable(string command, int e)
{
    DataTable dt = new DataTable(); 

    dt.Columns.Add("no", typeof(string));
    dt.Columns.Add("desc", typeof(string));
    dt.Columns.Add("code", typeof(string));
    dt.Columns.Add("measure", typeof(string));
    dt.Columns.Add("qty", typeof(int));
    dt.Columns.Add("price", typeof(double));

    foreach (DataListItem item in DataList4.Items) 
    {
        string no = ((TextBox)item.FindControl("no")).Text;
        string desc = ((TextBox)item.FindControl("desc")).Text;
        string code = ((TextBox)item.FindControl("code")).Text;
        string measure = ((TextBox)item.FindControl("measure")).Text;
        int qty = Convert.ToInt16(((TextBox)item.FindControl("qty")).Text);
        double price = Convert.ToDouble(((TextBox)item.FindControl("price")).Text.TrimStart('$'));

        dt.Rows.Add(no, desc, code, measure, qty, price);
    }

    if (command == "add")
    {
        DataRow dr = dt.NewRow();
        dt.Rows.Add(dr);

        DataList4.DataSource = dt;
        DataList4.DataBind();
    }
    else if (command == "del")
    {
        dt.Rows[e].Delete();

        DataList4.DataSource = dt;
        DataList4.DataBind();                   
    }
}

跟:

protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
{
    if (e.CommandName == "addRow")
    {   
        doDataTable("add", e.Item.ItemIndex);
    }

    if (e.CommandName == "delRows")
    {   
        doDataTable("del", e.Item.ItemIndex);
    }
}