2016-08-30 5 views
0

ダイナミックに作成されたリンクボタンのどれかをクリックすると、選択したリンクボタンの列インデックスを動的に見つけることができます。すべてのボタンは動的に作成され、行と列もグリッドビューで動的に作成されます。関連リンクボタンをクリックすると、gridviewの個々のセルを削除する必要があります。列と行インデックスを見つける必要があるように、このスクリーンショットは問題のアイデアを示します。関連するセルボタンをクリックすると、一度にgridviewの単一セルを削除する方法

このコードは、列が固定されていない場合に動的にリンクボタンを作成するためのコードです。グリッドビューの関連するセルの削除ボタンをクリックすると、単一セルを削除する必要があります。

protected void gv_TT_RowCreated(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.Header) 
     { 
      e.Row.Cells[2].Visible = false; 
      e.Row.Cells[1].Attributes.Add("colspan", "2"); 
     } 
     int index = e.Row.RowIndex; 
     int k = 0; 
     GVdata = (DataTable)ViewState["GVdata"]; 
     GridViewTable = (DataTable)ViewState["GridViewTable"]; 

    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     for (int i = 0; i < GVdata.Rows.Count; i++) 
     { 

      // ADD LINK BUTTON IF row.text != Empty(Blank) 
      if (e.Row.Cells[i + 3].ToString() != "&nbsp;") 
      { 
       if (e.Row.Cells[i + 3].ToString() != " ") 
       { 
        if (e.Row.Cells[i + 3].ToString() != string.Empty) 
        { 
         Label txt = new Label(); 

         LinkButton lb1 = new LinkButton(); 
         lb1.ID = k + "_" + (i + 3) + "Btn1"; 
         lb1.Text = " Update "; 
         lb1.ForeColor = System.Drawing.Color.Blue; 

         LinkButton lb2 = new LinkButton(); 
         lb2.ID = k + "_" + (i + 3) + "Btn2"; 
         lb2.Text = " Delete "; 
         lb2.ForeColor = System.Drawing.Color.Red; 

         lb1.CausesValidation = false; 
         lb1.Click += new EventHandler(Update_Click); 
         lb2.CausesValidation = false; 
         lb2.Click += new EventHandler(Delete_Click); 

         txt.Text = GridViewTable.Rows[index][i + 3].ToString(); 
         e.Row.Cells[i + 3].Controls.Add(txt); 
         e.Row.Cells[i + 3].Controls.Add(lb1); 
         e.Row.Cells[i + 3].Controls.Add(lb2); 
        } 
       } 
      } 
     } 
     k++; 
    } 
} 

Click here for Screen Shot image output of Sample Code enter image description here

答えて

0

あなたはグリッドから行を削除するために、これを行うことができます。 GridViewのテンプレートで

<asp:Button ID="Button1" runat="server" Text="Delete" CommandName="delRow" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "itemID").ToString() %>' /> 

そして

protected void gv_TT_RowCommand(object sender, GridViewCommandEventArgs e) 
    { 
     if (e.CommandName == "delRow") 
     { 
      //get the id from the button and covert it 
      int itemID = Convert.ToInt32(e.CommandArgument); 

      //cast the viewstate as a datatable 
      DataTable dt = ViewState["GridViewTable"] as DataTable; 

      //filter out the row with the itemID to be deleted with Linq 
      DataTable dtFiltered = dt.AsEnumerable().Where(row => row.Field<int>("itemID") != itemID).CopyToDataTable(); 

      //set the viewstate with the filtered datatable 
      ViewState["GridViewTable"] = dtFiltered; 

      //rebind the grid 
      GridView1.DataSource = dtFiltered; 
      GridView1.DataBind(); 
     } 
    } 

の背後にあるコードでRowCommandにあなたの問題は、しかし、動的な制御です。一つだけ問題があります

protected void gv_TT_RowCreated(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      LinkButton lb1 = new LinkButton(); 
      lb1.ID = "Btn1"; 
      lb1.Text = "DeleteRow"; 
      lb1.CommandName = "delRow"; 
      //value cannot be assigned yet 
      //lb1.CommandArgument = ""; 
      lb1.ForeColor = System.Drawing.Color.Blue; 

      e.Row.Cells[1].Controls.Add(lb1); 
     } 
    } 

:あなたは動的制御を追加するとき、あなたはそれが上記のスニペットでは、ボタンのように動作するためにボタンにCommandNameCommandArgumentを追加する必要があります。 CommandArgumentを割り当てるには、GridViewからのデータを使用する必要がありますが、データはまだRowCreatedに存在しません。したがって、RowDataBoundイベントの値を割り当てる必要があります。

protected void gv_TT_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      DataRowView drv = e.Row.DataItem as DataRowView; 
      LinkButton lb1 = e.Row.FindControl("Btn1") as LinkButton; 
      lb1.CommandArgument = drv["itemID"].ToString(); 
     } 
    } 
関連する問題