Gridview перезаписывает строки
С помощью этот пример- У меня есть проблема.
У меня есть gridview:
<asp:GridView ID="GridView1" runat="server" ShowFooter="True" AutoGenerateColumns="False" Width="100%" Height="100%"> <Columns> <asp:BoundField DataField="RowNumber" HeaderText="Nr."> <ControlStyle BorderStyle="None" /> </asp:BoundField> <asp:TemplateField HeaderText="Message"> <ItemTemplate> <asp:TextBox Native="True" ID="txtName" runat="server"></asp:TextBox> </ItemTemplate> <ControlStyle BorderStyle="None" /> </asp:TemplateField> <asp:TemplateField HeaderText="Data"> <ItemTemplate> <asp:TextBox ID="txtAge" runat="server"></asp:TextBox> </ItemTemplate> <ControlStyle BorderStyle="None" /> </asp:TemplateField> </Columns> </asp:GridView>
и 2 пуговицы. Когда я нажимаю каждую кнопку, в Gridview вставляется новая строка. Для создания и привязки данных tot GridView у меня есть 2 функции:
private void AddNewRow(string s, string s1) { int rowIndex = 0; if (ViewState["CurrentTable"] != null) { DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"]; DataRow drCurrentRow = null; if (dtCurrentTable.Rows.Count > 0) { for (int i = 1; i <= dtCurrentTable.Rows.Count; i++) { TextBox TextBoxName = (TextBox)GridView1.Rows[rowIndex].Cells[1].FindControl("txtName"); TextBoxName.Text = s; TextBox TextBoxAge = (TextBox)GridView1.Rows[rowIndex].Cells[2].FindControl("txtAge"); TextBoxAge.Text = s1; drCurrentRow = dtCurrentTable.NewRow(); drCurrentRow["RowNumber"] = i + 1; dtCurrentTable.Rows[i - 1]["Col1"] = TextBoxName.Text; dtCurrentTable.Rows[i -1]["Col2"] = TextBoxAge.Text; rowIndex++; } dtCurrentTable.Rows.Add(drCurrentRow); ViewState["CurrentTable"] = dtCurrentTable; GridView1.DataSource = dtCurrentTable; GridView1.DataBind(); } } else { Response.Write("ViewState is null"); } 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 TextBoxName = (TextBox)GridView1.Rows[rowIndex].Cells[1].FindControl("txtName"); TextBox TextBoxAge = (TextBox)GridView1.Rows[rowIndex].Cells[2].FindControl("txtAge"); TextBoxName.Text = dt.Rows[i]["Col1"].ToString(); TextBoxAge.Text = dt.Rows[i]["Col2"].ToString(); rowIndex++; } } } }
Когда я нажимаю на кнопку 1, данные привязываются и создается новая строка:
protected void Button1_Click(object sender, EventArgs e) { DateTime data = DateTime.Now; string dt = data.ToString(); AddNewRow("Start", dt); }
Когда я нажимаю на кнопку 2, данные привязываются и создается новая строка:
>protected void Button2_Click(object sender, EventArgs e) { DateTime data = DateTime.Now; string dt = data.ToString(); AddNewRow("Stop", dt); }
Допустим, сначала я нажимаю на кнопку 1. Все в порядке. Первая строка содержит сообщение "старт" и соответствующую дату. Также создается новая строка. Если я нажимаю кнопку 2, строка 2 содержит сообщение "стоп" и соответствующую дату, но также первая строка перезаписывается сообщением "стоп". Что я должен сделать, чтобы не перезаписать первую строку?
Что я уже пробовал:
То, что я пробовал, уже показано.
Herman<T>.Instance
Я думаю, что проблема заключается в состоянии просмотра. Он устанавливается один раз и возобновляется. Я не вижу никакого кода, где ViewState обновляется после добавления строки.
DrgIonuţ
Хорошо. Но новая строка добавляется с текстом из кнопки 2. Проблема в том, что строка 1 обновляется сообщением из строки 2.
Herman<T>.Instance
Да, но первая новая строка не добавляется в состояние просмотра, поэтому вы добавляете вторую строку в исходное состояние просмотра. Если вы поставите точку останова @ DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"]; вы увидите....
DrgIonuţ
Чтобы увидеть что? Кажется, все в порядке.
CHill60
Если вы используете отладчик и входите в свою функцию AddNewRow, вы увидите, что входите в цикл, который устанавливает каждую строку в вашей таблице данных в текст, переданный ей.
DrgIonuţ
Если я прокомментирую "dtCurrentTable.Rows[i - 1]["Col1"] = TextBoxName.Текст;
dtCurrentTable.Строки[i -1]["Col2"] = TextBoxAge.Текст;", текст не отображается. Что же мне делать?
CHill60
Не просто комментируйте строки кода случайным образом!
Я не знаю, почему вы решили перезаписать все существующие строки этими значениями, но если бы я просто хотел добавить новую строку, я бы создал новую строку, заполнил эту строку своими данными (это тот бит, который вам не хватает), затем добавил эту строку в источник данных, а затем повторно привязал.
DrgIonuţ
Я не хочу переписывать предыдущую строку. Вот почему я задаю этот вопрос. Что-то должно быть изменено в моем коде, чтобы не перезаписать, но я не знаю, что именно...
Richard MacCutchan
Возможно, если вы разместите свой вопрос на форуме в конце статьи, на которую ссылается ваш вопрос, у автора будут какие-то предложения.
DrgIonuţ
Я так и сделал, но я прыгал, чтобы быть чем-то простым для изменения в моем коде.