Gridview toujours ajouter de nouvelle ligne lorsque, cliquez sur le bouton?
Je vais écrire le code qui créer une nouvelle ligne dans gridview lors d'un clic de bouton. Le nombre de lignes sont créées par la valeur dans la zone de texte. Ex: Quand j'ai entrer la valeur 2 dans la zone de texte, bien sûr, les deux lignes seront ajoutées, mais quand j'ai cliqué sur le bouton nouveau, troisième rangées encore ajouté. Veuillez vérifier mon code ici:
ASPX
<asp:TextBox ID="txtVisitor" runat="server"></asp:TextBox>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:GridView ID="Gridview1" runat="server" ShowFooter="true" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="RowNumber" HeaderText="Row Number" />
<asp:TemplateField HeaderText="Header 1">
<ItemTemplate>
<asp:TextBox ID="txtDate" runat="server"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Header 2">
<ItemTemplate>
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Header 3">
<ItemTemplate>
<asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
</ItemTemplate>
<FooterStyle HorizontalAlign="Right" />
<FooterTemplate>
<asp:Button ID="ButtonAdd" runat="server" Text="Add New Row" OnClick="ButtonAdd_Click" />
</FooterTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
Code_Behind
protected void ButtonAdd_Click(object sender, EventArgs e)
{
int visitors = Convert.ToInt32(txtVisitor.Text);
AddNewRowToGrid(visitors);
}
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)));
dt.Columns.Add(new DataColumn("Column2", typeof(string)));
dt.Columns.Add(new DataColumn("Column3", typeof(string)));
dr = dt.NewRow();
dr["RowNumber"] = 1;
dr["Column1"] = string.Empty;
dr["Column2"] = string.Empty;
dr["Column3"] = string.Empty;
dt.Rows.Add(dr);
//dr = dt.NewRow();
//Store the DataTable in ViewState
ViewState["CurrentTable"] = dt;
Gridview1.DataSource = dt;
Gridview1.DataBind();
}
private void AddNewRowToGrid(int visitors)
{
if (ViewState["CurrentTable"] != null)
{
DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"];
DataRow drCurrentRow;
if (dtCurrentTable.Rows.Count > 0)
{
int rowindex = 0;
for (int i = 1; i < visitors; i++)
{
//extract the TextBox values
TextBox box1 = (TextBox)Gridview1.Rows[rowindex].Cells[1].FindControl("txtDate");
TextBox box2 = (TextBox)Gridview1.Rows[rowindex].Cells[2].FindControl("TextBox2");
TextBox box3 = (TextBox)Gridview1.Rows[rowindex].Cells[3].FindControl("TextBox3");
drCurrentRow = dtCurrentTable.NewRow();
drCurrentRow["RowNumber"] = i + 1;
drCurrentRow["Column1"] = box1.Text;
drCurrentRow["Column2"] = box2.Text;
drCurrentRow["Column3"] = box3.Text;
dtCurrentTable.Rows.Add(drCurrentRow);
drCurrentRow = null;
rowindex++;
}
//add new row to DataTable
//Store the current data to ViewState
ViewState["CurrentTable"] = dtCurrentTable;
//Rebind the Grid with the current data
Gridview1.DataSource = dtCurrentTable;
Gridview1.DataBind();
}
}
else
{
Response.Write("ViewState is null");
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
SetInitialRow();
}
}
- D'accord, pourriez-vous nous expliquer le point de la zone de texte? Je suis en cours d'exécution de votre code et si je fais quoi que ce soit, mais 2, alors il n'a pas ajouter toutes les lignes. La raison pour cela est parce que vous êtes en essayant de trouver les contrôles de zone de texte via le contrôle GridView de lignes de collecte et depuis il n'y a qu'une seule ligne dans la grille pour commencer avec, si vous tapez quelque chose de supérieur à 2, alors il les bombes après la première itération de boucle.
- Quel est le problème dans mon code. Espère que vous m'aider
Vous devez vous connecter pour publier un commentaire.
Ici, est le problème n ° 1 avec votre code:
vous définissez i 1
le remplacer pour le nombre de lignes de contrôle gridview
démarrer à partir d'elle
Ici, est le problème n ° 1 avec votre code:
Cette logique est erronée et n'est même pas nécessaire, parce que lorsque vous liez la grille, il va parcourir la collection vous offre la
DataSource
et l'utilisation de laTemplateFields
que vous avez défini dans le balisage pour créer chaque ligne.Les lignes ne sont pas effectivement ajouté jusqu'à ce que le contrôle GridView est lié à une source de données, un
DataTable
dans votre cas, comme ceci:L'étape n ° 1 est de supprimer la
FindControl
les lignes de votreAddNewRowToGrid
méthode.Je ne suis même pas sûr de ce que vous voulez accomplir dans votre code.
FindControl
dans une minute, mais quel est le problème avec les visiteurs de la zone de texte et pourquoi est-ce que le contrôle combien de fois la boucle se passe?for (int i = 1; i < visitors; i++)
boucle est écrit, vous avez une par une erreur; en d'autres mots, lorsque vous tapez 2 dans la zone de texte, il n'est pas l'ajout de deux lignes, mais plutôt parce que je commence à 1 et est ensuite comparé à moins de 2 et passe par la boucle, la prochaine itération 2 n'est pas moins de 2 pour qu'il cesse de la boucle. C'est pourquoi je vous demande ce que vous êtes vraiment essayer de l'atteindre avec cette logique.