Добавить новые записи в GridView, но БД не должна обновляться - PullRequest
2 голосов
/ 29 октября 2010

У меня есть вид сетки, который связан с видом данных, OnPageLoad Я заполняю записи вида сетки. и у меня есть текстовое поле и кнопка, так что теперь я хочу добавить больше записей в GridView, но эти записи не должны добавляться в БД, они просто добавляются на страницу и, конечно, записи по умолчанию, поступающие из базы данных, остаются.

<asp:GridView id="gvItems" runat="server">
 <Columns>
   <asp:TemplateField HeaderText="Item Code" SortExpression="ItemCode">
      <ItemTemplate>
           <asp:Label runat="server" ID="lblIItemCode" Text='<%# Bind("ItemCode") %>' />
      </ItemTemplate>
   </asp:TemplateField>
 </Columns>
</asp:GridView>

Код VB.NET:

dvSCart = data.GetSCart(Session("SCartId"), 0, varFilterClause, errorStr)
gvItems.DataSource = dvSCart
gvItems.DataBind()

Вначале на страницу приходят данные из БД, затем Textbox данные должны быть добавлены к Gridview, но база данных не должна обновляться. я попытался сделать это, сохранив DataView в ViewState or Session variable, но позже я узнал, что иду не в ту сторону, и это не сработает, поскольку Dataview не может быть Serialized. Мне просто нужна идея или правильный путь, чтобы сделать это, возможно ли это, что я делаю? может быть, я думаю, что jQuery поможет, я гуглил на jQuery, но я не смог, или, может быть, я не понял, так как я новичок в jQuery ..

[мой альтернативный вариант]: создать временную таблицу БД и сохранить ее ... но я не хочу использовать эту опцию ..

Ответы [ 5 ]

3 голосов
/ 01 ноября 2010

Вы должны перетащить свои данные в DataTable и / или DataSet и сохранить их в объекте Session. Затем вы можете обновить этот объект новыми строками и выполнять повторную привязку каждый раз, когда вносите изменения.

Пример:

PageLoad

        if (!IsPostBack)
        {
            DataTable dt = new DataTable();

            using (SqlConnection con = new SqlConnection(conString))
            {
                SqlCommand cmd = new SqlCommand("SELECT Id, Name, Price FROM MyCart;", con);
                con.Open();

                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
            }

            Session["MyData"] = dt;
            GridView1.DataSource = dt;
            GridView1.DataBind();
        }

Теперь у вас есть привязка данных к вашему GridView1, и у вас есть копия исходных данных в вашем объекте сеанса. Теперь давайте добавим элемент в gridview и обновим наш dt в нашем объекте сеанса.

        DataTable dt = new DataTable();

        if (Session["MyData"] != null)
        {
            dt = (DataTable)Session["MyData"];
        }

        DataRow dr = dt.NewRow();
        dr["Id"] = dt.Rows.Count + 1;
        dr["Name"] = "My New Item";
        dr["Price"] = 19.99;

        dt.Rows.Add(dr);

        Session["MyData"] = dt;
        GridView1.DataSource = dt;
        GridView1.DataBind();

Итак, вы добавили элемент в свою таблицу данных и повторно связали его с GridView.

Если вы хотите сделать все это на стороне клиента, вы можете легко добавить строку таблицы, используя jQuery, но вам нужно будет сохранить таблицу / данные, если вам это нужно на нескольких страницах.

0 голосов
/ 01 ноября 2010

Один из способов сделать это.

1. получить данные из БД, поместить их в список объектов, представляющих строки / записи.
2. привязать этот список к GridView, таким образом вы привязываетесь к списку объектов, а не к записям БД.
3. при добавлении нового элемента добавьте в список.
4. перепривязать GridView

0 голосов
/ 01 ноября 2010

Вы не можете смешивать связанные записи, поступающие из вашей БД, с новыми записями так, как вы описали.

Для этого используйте несвязанную сетку, которую вы заполняете из БД, а затем добавьте новые записи.

0 голосов
/ 01 ноября 2010

Невозможно вручную заполнить серверный элемент управления GridView в коде, не являющемся серверным, т.е. без обратной отправки.

Вы можете объединить данные из БД с ручными данными, а затем связать их с GridView. Но вы сделаете это с помощью code-behind, т.е. используя post back.

Если GridView.DataSource не имеет InsertCommand, то никакие данные не будут вставлены! Не бойся постить обратно!

0 голосов
/ 29 октября 2010

Я все еще довольно новичок в .NET, так что возьмите это с "зерном соли" ...

Я думаю, что 'Bind' - это двустороннее связывание, означающее, что данные из источника данных GridView используются дляЗаполните сетку, и данные, введенные в GridView в режиме редактирования, также заполнят источник данных.Существует односторонняя директива связывания, называемая 'Eval', которая, я думаю, может заполнить сетку без заполнения источника данных.

Другое наблюдение состоит в том, что GridView изначально не поддерживают операции вставки, поэтому, если вы собираетесь разрешить новые строки,не из базы данных вы должны будете добавить элементы управления вставкой и подключить их (или не подключать) к источнику данных самостоятельно.У меня было похожее требование, когда изменение вида сетки не должно было изменять источник данных, пока не была нажата внешняя кнопка «Сохранить».В моем случае у меня был дополнительный уровень бизнес-логики, который служил источником данных.Этот источник данных бизнес-объекта представлял собой снимок базы данных для целей буферизации изменений, внесенных в GridView до нажатия кнопки «Сохранить».Мне удалось сохранить этот бизнес-объект через обратные передачи с помощью кэша сеанса, даже если бизнес-объект не был сериализуемым.Я думаю, что он должен быть сериализуемым, чтобы хранить его в viewstate, но, возможно, не в состоянии сеанса.Возможно, состояние представления сериализуется и отправляется клиенту назад и вперед, тогда как состояние сеанса хранится только на сервере, поэтому сериализацию не нужно.

Надеюсь, что все это помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...