如何在 DataList c# 中动态删除行 asp
How to dynamically delete rows in DataList c# asp
寻找一种从数据列表中动态删除行的方法,为用户提供一种'clean up'他们的输入界面的方法。 asp 数据列表从 SQL 加载,然后用户在将其发送到另一个数据库之前操作 table。
我通过使用 datatable 会话变量,向其中添加行然后重新绑定到数据列表来实现 'addRows' 功能,但是我似乎无法获得相同的功能删除行。
目前的逻辑是使用数据列表'delRows'命令,从asp数据列表中获取当前输入或修改的数据,将其分配给数据table,循环数据table 并删除某些字段为空的行,然后将 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();
}
希望有更好的方法来完成这个!更不用说工作了....
对于任何未来的信息搜索者:必须循环通过 table 以将最新的文本框文本放入 dt,然后在代码后面修改 dt 数据table,然后将 dt 重新绑定到数据列表。
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);
}
}
寻找一种从数据列表中动态删除行的方法,为用户提供一种'clean up'他们的输入界面的方法。 asp 数据列表从 SQL 加载,然后用户在将其发送到另一个数据库之前操作 table。
我通过使用 datatable 会话变量,向其中添加行然后重新绑定到数据列表来实现 'addRows' 功能,但是我似乎无法获得相同的功能删除行。
目前的逻辑是使用数据列表'delRows'命令,从asp数据列表中获取当前输入或修改的数据,将其分配给数据table,循环数据table 并删除某些字段为空的行,然后将 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();
}
希望有更好的方法来完成这个!更不用说工作了....
对于任何未来的信息搜索者:必须循环通过 table 以将最新的文本框文本放入 dt,然后在代码后面修改 dt 数据table,然后将 dt 重新绑定到数据列表。
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);
}
}