2017-06-01 97 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