2017-11-10 18 views
0

データリストから行を動的に削除する方法を探して、ユーザーに入力インターフェースをクリーンアップする方法を提供します。 aspデータリストはSQLからロードされ、ユーザーはテーブルを操作して別のデータベースに送信します。DataList c#で行を動的に削除する方法asp

私はデータテーブルのセッション変数を使用して、それに行を追加してからデータリストに再バインドすることで機能する 'addRows'を持っていますが、行を削除すると同じ機能を持つようには見えません。

現在のロジックは、データリスト 'delRows'コマンドを使用して、現在の入力または変更されたデータをaspデータリストから取得し、データテーブルに割り当て、データテーブルをループして特定のフィールドが空の行を削除し、 aspデータリストにdatatable。

現在のコードの後処理が、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

。 DataTableを使用してデータを取得するだけではどうですか? – MethodMan

+0

この変数にはどこに値を割り当てていますか? 'Session [" dataList1 "] = DataList1;'後方参照 – MethodMan

+0

セッション["dataList1"]はaddRowコマンドでバインドされます。私が実行していると信じている問題は、現在のデータリストの状態を取得する方法です。つまり、ユーザーはそれを変更できますが、その '現在の状態'を取得してループする必要があります。私はセッション変数にそれをつかんで、それからセッションをdatatable(dt)にしてから、ループスルーテーブルを考えていました。セッション["dataList1"] = DataList1;見つかったデータリストコントロールを前の行から取得し、それをセッション変数に割り当てます。 – SDG

答えて

0

将来の情報検索者のために:現在のテキストボックステキストをdtに変換し、dtデータテーブルをコードの背後で修正してから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();     
    } 
} 

あなたがDataListコントロールにデータをバインドしている
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); 
    } 
} 
関連する問題