DrgIonuţ Ответов: 1

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&lt;T&gt;.Instance

Я думаю, что проблема заключается в состоянии просмотра. Он устанавливается один раз и возобновляется. Я не вижу никакого кода, где ViewState обновляется после добавления строки.

DrgIonuţ

Хорошо. Но новая строка добавляется с текстом из кнопки 2. Проблема в том, что строка 1 обновляется сообщением из строки 2.

Herman&lt;T&gt;.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ţ

Я так и сделал, но я прыгал, чтобы быть чем-то простым для изменения в моем коде.

1 Ответов

Рейтинг:
1

CHill60

Попробуйте что - то вроде следующего (предостережение- непроверенное)

DataRow drCurrentRow = dtCurrentTable.NewRow();
drCurrentRow["Col1"] = s;
drCurrentRow["Col2"] = s1;
dtCurrentTable.Rows.Add(drCurrentRow);


DrgIonuţ

Спасибо за ваш ответ, CHill60!
Моя функция AddNewRow теперь выглядит так:
private void AddNewRow(string strg, string strg1)
{
DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"];
DataRow drCurrentRow = null;

drCurrentRow = dtCurrentTable.Невров();
drCurrentRow["Col1"] = strg;
drCurrentRow["Col2"] = strg1;
dtCurrentTable.Rows.Add(drCurrentRow);
ViewState["CurrentTable"] = dtCurrentTable;
Управления gridview1.Источник данных = dtCurrentTable;
Управления gridview1.Привязку();
}
Новая строка добавляется, но текст не появляется. Я также попытался заменить "strg" и "strg1" на "ab" и "cd", но результат тот же самый.

CHill60

попробуйте drCurrentRow["Message"].Value = s и т. д. Используйте отладчик, чтобы проверить, что DataTable правильно заполнен и вы используете правильные имена столбцов. Если это нормально, то это привязка данных или способ настройки вашего gridview.
Извините - в данный момент у меня здесь нет Visual Studio, поэтому я не могу отлаживать ваш код

DrgIonuţ

Свойство "Value" не существует. Спасибо! :)