2016-09-05 115 views
0

我在gridview中創建了動態textboxsdropdownlist。它工作完美。此外,我想在動態dropdownlist中觸發事件並執行一些操作。在Gridview中動態創建按鈕中處理事件

private ArrayList GetDummyData() { 

    ArrayList arr = new ArrayList(); 

    arr.Add(new ListItem("Item1", "1")); 
    arr.Add(new ListItem("Item2", "2")); 
    arr.Add(new ListItem("Item3", "3")); 
    arr.Add(new ListItem("Item4", "4")); 
    arr.Add(new ListItem("Item5", "5")); 

    return arr; 
} 

private void FillDropDownList(DropDownList ddl) { 
    ArrayList arr = GetDummyData(); 

    foreach (ListItem item in arr) { 
     ddl.Items.Add(item); 
    } 
} 

private void SetInitialRow() { 

    DataTable dt = new DataTable(); 
    DataRow dr = null; 

    dt.Columns.Add(new DataColumn("RowNumber", typeof(string))); 
    dt.Columns.Add(new DataColumn("Column1", typeof(string)));//for TextBox value 
    dt.Columns.Add(new DataColumn("Column2", typeof(string)));//for TextBox value 
    dt.Columns.Add(new DataColumn("Column3", typeof(string)));//for DropDownList selected item 
    dt.Columns.Add(new DataColumn("Column4", typeof(string)));//for DropDownList selected item 

    dr = dt.NewRow(); 
    dr["RowNumber"] = 1; 
    dr["Column1"] = string.Empty; 
    dr["Column2"] = string.Empty; 
    dt.Rows.Add(dr); 

    //Store the DataTable in ViewState for future reference 
    ViewState["CurrentTable"] = dt; 

    //Bind the Gridview 
    Gridview1.DataSource = dt; 
    Gridview1.DataBind(); 

    //After binding the gridview, we can then extract and fill the DropDownList with Data 
    DropDownList ddl1 = (DropDownList)Gridview1.Rows[0].Cells[3].FindControl("DropDownList1"); 
    DropDownList ddl2 = (DropDownList)Gridview1.Rows[0].Cells[4].FindControl("DropDownList2"); 
    FillDropDownList(ddl1); 
    FillDropDownList(ddl2); 
} 

private void AddNewRowToGrid() { 

    if (ViewState["CurrentTable"] != null) { 

     DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"]; 
     DataRow drCurrentRow = null; 

     if (dtCurrentTable.Rows.Count > 0) { 
      drCurrentRow = dtCurrentTable.NewRow(); 
      drCurrentRow["RowNumber"] = dtCurrentTable.Rows.Count + 1; 

      //add new row to DataTable 
      dtCurrentTable.Rows.Add(drCurrentRow); 
      //Store the current data to ViewState for future reference 

      ViewState["CurrentTable"] = dtCurrentTable; 


      for (int i = 0; i < dtCurrentTable.Rows.Count - 1; i++) { 

       //extract the TextBox values 

       TextBox box1 = (TextBox)Gridview1.Rows[i].Cells[1].FindControl("TextBox1"); 
       TextBox box2 = (TextBox)Gridview1.Rows[i].Cells[2].FindControl("TextBox2"); 

       dtCurrentTable.Rows[i]["Column1"] = box1.Text; 
       dtCurrentTable.Rows[i]["Column2"] = box2.Text; 

       //extract the DropDownList Selected Items 

       DropDownList ddl1 = (DropDownList)Gridview1.Rows[i].Cells[3].FindControl("DropDownList1"); 
       DropDownList ddl2 = (DropDownList)Gridview1.Rows[i].Cells[4].FindControl("DropDownList2"); 

       // Update the DataRow with the DDL Selected Items 

       dtCurrentTable.Rows[i]["Column3"] = ddl1.SelectedItem.Text; 
       dtCurrentTable.Rows[i]["Column4"] = ddl2.SelectedItem.Text; 

      } 

      //Rebind the Grid with the current data to reflect changes 
      Gridview1.DataSource = dtCurrentTable; 
      Gridview1.DataBind(); 
     } 
    } 
    else { 
     Response.Write("ViewState is null"); 

    } 
    //Set Previous Data on Postbacks 
    SetPreviousData(); 
} 

private void SetPreviousData() { 

    int rowIndex = 0; 
    if (ViewState["CurrentTable"] != null) { 

     DataTable dt = (DataTable)ViewState["CurrentTable"]; 
     if (dt.Rows.Count > 0) { 

      for (int i = 0; i < dt.Rows.Count; i++) { 

       TextBox box1 = (TextBox)Gridview1.Rows[i].Cells[1].FindControl("TextBox1"); 
       TextBox box2 = (TextBox)Gridview1.Rows[i].Cells[2].FindControl("TextBox2"); 

       DropDownList ddl1 = (DropDownList)Gridview1.Rows[rowIndex].Cells[3].FindControl("DropDownList1"); 
       DropDownList ddl2 = (DropDownList)Gridview1.Rows[rowIndex].Cells[4].FindControl("DropDownList2"); 

       //Fill the DropDownList with Data 
       FillDropDownList(ddl1); 
       FillDropDownList(ddl2); 

       if (i < dt.Rows.Count - 1) { 

        //Assign the value from DataTable to the TextBox 
        box1.Text = dt.Rows[i]["Column1"].ToString(); 
        box2.Text = dt.Rows[i]["Column2"].ToString(); 

        //Set the Previous Selected Items on Each DropDownList on Postbacks 
        ddl1.ClearSelection(); 
        ddl1.Items.FindByText(dt.Rows[i]["Column3"].ToString()).Selected = true; 

        ddl2.ClearSelection(); 
        ddl2.Items.FindByText(dt.Rows[i]["Column4"].ToString()).Selected = true; 

       } 

       rowIndex++; 
      } 
     } 
    } 
} 

protected void Page_Load(object sender, EventArgs e) { 
    if (!Page.IsPostBack) { 
     SetInitialRow(); 
    } 
} 

protected void ButtonAdd_Click(object sender, EventArgs e) { 
    AddNewRowToGrid(); 
} 

protected void Gridview1_RowCreated(object sender, GridViewRowEventArgs e) { 
    if (e.Row.RowType == DataControlRowType.DataRow) { 
     DataTable dt = (DataTable)ViewState["CurrentTable"]; 
     LinkButton lb = (LinkButton)e.Row.FindControl("LinkButton1"); 
     if (lb != null) { 
      if (dt.Rows.Count > 1) { 
       if (e.Row.RowIndex == dt.Rows.Count - 1) { 
        lb.Visible = false; 
       } 
      } 
      else { 
       lb.Visible = false; 
      } 
     } 
    } 
} 

protected void LinkButton1_Click(object sender, EventArgs e) { 
    LinkButton lb = (LinkButton)sender; 
    GridViewRow gvRow = (GridViewRow)lb.NamingContainer; 
    int rowID = gvRow.RowIndex; 
    if (ViewState["CurrentTable"] != null) { 

     DataTable dt = (DataTable)ViewState["CurrentTable"]; 
     if (dt.Rows.Count > 1) { 
      if (gvRow.RowIndex < dt.Rows.Count - 1) { 
       //Remove the Selected Row data and reset row number 
       dt.Rows.Remove(dt.Rows[rowID]); 
       ResetRowID(dt); 
      } 
     } 

     //Store the current data in ViewState for future reference 
     ViewState["CurrentTable"] = dt; 

     //Re bind the GridView for the updated data 
     Gridview1.DataSource = dt; 
     Gridview1.DataBind(); 
    } 

    //Set Previous Data on Postbacks 
    SetPreviousData(); 
} 

private void ResetRowID(DataTable dt) { 
    int rowNumber = 1; 
    if (dt.Rows.Count > 0) { 
     foreach (DataRow row in dt.Rows) { 
      row[0] = rowNumber; 
      rowNumber++; 
     } 
    } 
} 
+0

那麼最後是什麼問題? –

+0

如何在gridview中動態創建下拉列表中觸發事件? –

+0

那麼,你想開火什麼樣的事件......你是否試圖將光標移動到指定的gridview上?您是否嘗試單擊或選擇DropDownList中的某些項目?這將激發你想要的事件。但是可能你想知道如何定義一個回調函數來調用這些事件,對吧?最後,我仍然繼續,不知道你想知道什麼 –

回答

0

可能是問題的重複:

how to add an OnClick event on DropDownList's ListItem that is added dynamically?

請檢查那裏給出了答案。

DropDownList changesList = new DropDownList(); 

ListItem item; 
item = new ListItem(); 
item.Text = "go to google.com"; 
item.Value = "http://www.google.com"; 

changesList.Items.Add(item); 
changesList.Attributes.Add("onChange", "location.href = this.options[this.selectedIndex].value;"); 

還有,你嘗試添加一個處理程序的事件SelectedIndexChanged動態添加新行到網格?

相關問題