2017-06-01 173 views
0

我已經創建了gridview。添加了一個文本框,用於指定用戶想要動態添加到網格的列數,併成功完成。動態添加itemboard到gridview

我想添加文本框到動態添加的字段來輸入數據並將其保存到數據庫(我可以添加文本字段到行並保存數據),但我還沒有任何解決方案。

我試着用銘牌,但我不太瞭解它。我在下面添加了我的代碼。 這裏是我的aspx代碼

     <input type="hidden" runat="server" value="0" id="columnAdded"/> 
        </td> 
       </tr> 
       <tr> 
        <td> 

        </td> 
       </tr> 
      </table> 




<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false"> 
    <Columns> 
     <%--<asp:CommandField ShowEditButton="True" />--%> 

     <asp:TemplateField HeaderText="S. No."> 
      <ItemTemplate> 
       <asp:Label ID="lblsno" runat="server" Text='<%#Container.DataItemIndex+1 %>'></asp:Label> 
      </ItemTemplate> 
      <FooterTemplate> 
       <asp:LinkButton ID="lbInsert" runat="server">Insert</asp:LinkButton> 
      </FooterTemplate> 
     </asp:TemplateField> 


      <asp:BoundField HeaderText="Parts" DataField="parts"> 

      </asp:BoundField> 

     <%--<asp:TemplateField> 
      <ItemTemplate> 
       <asp:PlaceHolder ID="PlaceHolder_InputControl" runat="server" ></asp:PlaceHolder> 
      </ItemTemplate> 

     </asp:TemplateField>--%> 

     <%--<asp:TemplateField> 
      <ItemTemplate> 
       <asp:Button ID="btnedit" runat="server" Text="Edit" CommandName="EditRow"/> 
      </ItemTemplate> 
     </asp:TemplateField>--%> 

     </Columns> 
</asp:GridView> 

,這裏是的.cs

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     try 
     { 
      drpstation.Items.Clear(); 

      con.Open(); 
      SqlCommand cmd = con.CreateCommand(); 
      cmd.CommandType = CommandType.Text; 
      cmd.CommandText = "select * from stationdesc where stndesc <> '' and id is not null"; 
      cmd.ExecuteNonQuery(); 
      DataSet ds = new DataSet(); 
      SqlDataAdapter da = new SqlDataAdapter(cmd); 
      da.Fill(ds, "stationdesc"); 

      drpstation.DataSource = ds.Tables[0]; 
      drpstation.DataTextField = ds.Tables[0].Columns["stndesc"].ColumnName.ToString(); 
      drpstation.DataValueField = ds.Tables[0].Columns["id"].ColumnName.ToString(); 
      drpstation.DataBind(); 
      drpstation.Items.Insert(0, new ListItem("Select Station", "0")); 
     } 
     catch (Exception ex) 
     { 
      string Msg = "select station error"; 
      Msg += ex.Message; 
     } 
     finally 
     { 
      con.Close(); 
     } 
    } 
    if (!IsPostBack) 
    { 

     griddisplay(); 


    } 
} 
public void griddisplay() 
{ 
    try 
    { 
     con.Open(); 
     SqlCommand cmd = new SqlCommand("SELECT * FROM stnparts", con); 
     SqlDataReader dr = cmd.ExecuteReader(); 
     GridView1.DataSource = dr; 
     GridView1.DataBind(); 
     //DataTable dt = new DataTable(); 
     //dt.Columns.Add("Parts", typeof(string)); 
     //DataRow drr = dt.NewRow(); 
     //drr["Parts"] = "Weldmet"; 
     //dt.Rows.Add(drr); 

     //drr = dt.NewRow(); 
     //drr["Parts"] = "MFG Parts"; 
     //dt.Rows.Add(drr); 

     //GridView1.DataSource = dt; 
     //GridView1.DataBind(); 

    } 
    catch (Exception d) 
    { 
     string message = "grid error"; 
     message += d.Message; 
    } 
    finally 
    { 
     con.Close(); 
    } 
} 
protected void btnadd_Click(object sender, EventArgs e) 
{ 
    int num; 
    num = Convert.ToInt32(txtnumber.Text.Trim()); 
    int addedColumn = Convert.ToInt32(columnAdded.Value); 
    for (int i = addedColumn + 1; i <= addedColumn + num; i++) 
    { 
     string name = "Unit"; 
     name = string.Concat(name, i); 
     TemplateField test = new TemplateField(); 
     test.HeaderText = name; 
     GridView1.Columns.Add(test); 
     TextBox txtname = new TextBox(); 
     string txtunit = "txtunit"; 
     txtname.ID = txtunit + i; 

    } 
    griddisplay(); 
    columnAdded.Value = (addedColumn + num).ToString(); 
} 

public class TemplateHandler : ITemplate 
{ 


    void ITemplate.InstantiateIn(Control container) 
    { 
     TextBox txtbox = new TextBox(); 

     txtbox.Text = "test"; 
     txtbox.DataBinding += Txtbox_Binding; 
     container.Controls.Add(txtbox); 

    } 

    private void Txtbox_Binding(object sender, EventArgs e) 
    { 
     //throw new NotImplementedException(); 
     TextBox txttest = (TextBox)sender; 
     GridViewRow container = (GridViewRow)txttest.NamingContainer; 
     //txttest.Text = ((TableNameClass)container.DataItem).SkillText; 
     ((DataRowView)container.DataItem)["SkillText"].ToString(); 
    } 
} 

請幫助

+0

你說:「我可以添加文本字段到行並保存數據」。那麼你現在面臨的問題是什麼? –

+0

我的列是動態的,如果列在GridView中是靜態的,我可以添加文本字段。 – nirmala

+0

我希望問題現在清楚 – nirmala

回答

0

只是一個僞/示例代碼(未測試!)根據您發佈的代碼,給你一些擡頭

protected void btnadd_Click(object sender, EventArgs e) 
{ 
    int num; 
    num = Convert.ToInt32(txtnumber.Text.Trim()); 
    int addedColumn = Convert.ToInt32(columnAdded.Value); 
    for (int i = addedColumn + 1; i <= addedColumn + num; i++) 
    { 
     string name = "Unit"; 
     name = string.Concat(name, i); 
     TemplateField test = new TemplateField(); 
     test.HeaderText = name; 
     test.ItemTemplate = new TemplateHandler(); // ** This line to set ItemTemplate is missing in the code you posted 
     GridView1.Columns.Add(test); 
     // ... Other code as you need 
    } 

} 

希望這有助於你。

+0

文本字段被添加到列,但問題是,當我在txtnumber文本框中輸入2時,Unit1和Unit2列添加了文本框,當我第二次單擊添加按鈕時,文本字段顯示爲Unit 3和Unit4列僅適用於Unit1和Unit2。 – nirmala

+0

那是因爲你編碼添加了列,並且指出了你的代碼中缺少的內容。 –

+0

非常感謝。但爲什麼以前的列文本字段不顯示? – nirmala