2017-11-10 102 views
0

尋找一種方式來動態刪除數據列中的行,爲用戶提供一種「清理」其輸入接口的方法。 asp datalist從SQL中加載,然後用戶在將表發送到另一個數據庫之前操作該表。如何動態刪除DataList中的行c#asp

我有一個功能'addRows'通過使用數據表會話變量,向它添加行然後重新綁定到數據列表,但我似乎無法得到相同的功能與刪除行。

當前邏輯是使用datalist'delRows'命令,從asp數據列表中獲取當前輸入或修改的數據,將其分配給數據表,通過數據表循環並刪除某些字段爲空的行,然後重新綁定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(); 
     } 

希望有一個更好的方式來做到這一點!更不用說工作了....

+0

你在哪裏將數據綁定到DataList。你爲什麼不使用DataTable來檢索你的數據? – MethodMan

+0

你在哪裏給這個變量賦值? Session [「dataList1」] = DataList1;'back backwards – MethodMan

+0

Session [「dataList1」]被綁定在addRow命令中。我相信我遇到的問題是如何獲取當前數據列表狀態,這意味着用戶可以對其進行修改,但是我需要獲取「當前狀態」並循環訪問它。我想把它抓到一個會話變量,然後會話到一個數據表(dt),然後循環通過表。 Session [「dataList1」] = DataList1;將從prev行抓取找到的datalist控件,然後將其分配給會話變量。 – SDG

回答

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