Member 11666220 Ответов: 1

Как сохранить значение в gridview после обратной передачи без использования базы данных


Моя текущая задача-создать систему расписания. Проблема в том, когда входное значение пользователя в GridView будет отсутствовать после страница была обновлена Я искал через другой форум, и нет никакого решения, которое могло бы соответствовать моей проблеме.

Я хотел бы объяснить, как работает моя система.

1. Есть раскрывающийся список, который пользователь выбирает, чтобы добавить новый проект в GridView.

&ЛТ;как ASP:dropdownlist с ИД="dd_project_no" атрибут runat="сервер" CssClass="tb_pro_no БТН-инфо"
OnSelectedIndexChanged="dd_project_no_SelectedIndexChanged" autopostback элемента управления="правда"и GT;
< / asp:DropDownList>
2. Тогда пользователь будет ставить какое-то значение внутри текстового поля в GridView в котором есть рабочие часы по проекту.

<asp:TemplateField ItemStyle-Width= "600px" HeaderText= "Saturday">
& lt;HeaderTemplate>
<div class= "form-inline">
&ЛТ;АСП:метка идентификатор="Label12" атрибут runat="сервер" текст="Сат" CssClass="коль-хз-12"&ГТ;&ЛТ;/АСП:ярлык&ГТ;
&ЛТ;%--&ЛТ;АСП:метка идентификатор="дсат" атрибут runat="сервер" текст="дата" CssClass="коль-хз-12"&ГТ;&ЛТ;/АСП:ярлык&ГТ;--%&ГТ;
&ЛТ;АСП:метка идентификатор="Label16" атрибут runat="сервер" текст="СТ" CssClass="коль-хз-5"&ГТ;&ЛТ;/АСП:ярлык&ГТ;
&ЛТ;АСП:метка идентификатор="Label17" атрибут runat="сервер" текст="от" CssClass="коль-хз-5"&ГТ;&ЛТ;/АСП:ярлык&ГТ;
< / div>
< / HeaderTemplate>
& lt;ItemTemplate>
<div class= "form-inline">
&ЛТ;АСП:текстовое поле с ID="sat_st" атрибут runat="сервер" CssClass="tb_day коль-хз-5"&ГТ;&ЛТ;/АСП:текстовое поле&ГТ;
&ЛТ;АСП:текстовое поле с ID="sat_ot" атрибут runat="сервер" CssClass="tb_day коль-хз-5" только для чтения="истинный"&ГТ;&ЛТ;/АСП:текстовое поле&ГТ;
< / div>
< / ItemTemplate>
& lt;FooterTemplate>
<div class= "form-inline">
&ЛТ;АСП:текстовое поле с ID="tb_nt_sat_tot" атрибут runat="сервер" CssClass="tb_day коль-хз-5"&ГТ;&ЛТ;/АСП:текстовое поле&ГТ;
&ЛТ;АСП:текстовое поле с ID="tb_ot_sat_tot" атрибут runat="сервер" CssClass="tb_day коль-хз-5"&ГТ;&ЛТ;/АСП:текстовое поле&ГТ;
< / div>
&ЛТ;АСП:метка идентификатор="checkTotalSat" атрибут runat="сервер" Цвет="Красный" размер шрифта="7.5"&ГТ;&ЛТ;/АСП:ярлык&ГТ;
< / FooterTemplate>
< / asp:TemplateField>

3.если пользователь хочет добавить новый проект после выбора выпадающего списка, то значение внутри текстового поля будет отсутствовать.
Код, стоящий за выпадающим списком проекта:

ДТ.Строк.Добавить(д-р);
ViewState ["Files"] = dt;

GridView1. DataSource = dt;
Управления gridview1.Привязку();


Мое предположение связано с тем, что значение для пользовательского ключа не сохраняется в источнике данных (который является ViewState ["Files"]), следовательно, оно сбрасывается на null.

Ценю за совет. Спасибо.

Что я уже пробовал:

Я попробовал использовать UpdatePanel и добавить данные привязки в

protected void Page_Load(отправитель объекта, EventArgs e)
{
если (! страница.IsPostBack)
{
Управления gridview1.Привязку();
}
}

1 Ответов

Рейтинг:
7

Thomas Nielsen - getCore

Из вашего кода я узнаю, что вы работаете с веб-формами (т. е. у вас есть объект page)

Здесь есть возможность использовать viewstate
Понимание ASP.NET состояние просмотра[^]

Это говорит о том, что gridview как таковой не имеет элементов управления, так что очень вероятно, что у вас есть gridview, который связан с некоторыми функциями редактирования, в этом случае вам нужно поймать эти данные по мере их публикации и хорошо ... Что? сделать новую строку или сохранить и обновить? Я думаю, вам тоже нужен этот учебник:
Учебник 12: Использование полей TemplateFields в элементе управления GridView[^]

Так что короче всего то, что когда вы публикуете что-то на asp.net веб-страница у вас будет доступ к значениям в запросе.Form [] array и в зависимости от того, является ли это клиентским или серверным элементом управления, после загрузки страницы вы можете получить доступ к нему на экземпляре элемента управления на стороне сервера.

Обновление: хорошо, вот решение аналогичной проблемы, использующее ViewState для сохранения данных и не использующее ObjectDatasource, который, вероятно, является тем, что вы хотите сделать в конечном счете, но придерживаясь рассматриваемого случая и сохраняя вещи как можно более простыми с помощью сетки :D Этот вариант создаст новую сетку на начальном GET и позволит вам играть с ней до тех пор, пока вы продолжаете публиковать сообщения, нажимая кнопки action linkbuttons на сетке.

Форма:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AnittyGriddy.aspx.cs" Inherits="WebFormsProj.AnittyGriddy" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <link href="Content/bootstrap.min.css" type="text/css" rel="stylesheet"  />
    <script src="Scripts/jquery-1.10.2.min.js" type="text/javascript"></script>

</head>
<body>
    <form id="form1" runat="server">
        <div class="row">
            <div class="col-xs-6"><label>Project scope</label></div>
            <div class="col-xs-6">
                <asp:DropDownList ID="ProjectDD" runat="server" Width="100%" OnSelectedIndexChanged="ProjectDD_SelectedIndexChanged" AutoPostBack="true">
                    <asp:ListItem Text="All" Value="all" Selected="True" />
                    <asp:ListItem Text="Add" Value="add" />
                </asp:DropDownList>
            </div>
        </div>
        <div class="row">
            <div class="col-xs-12">
                <asp:GridView ID="TheGrid" runat="server" Width="100%" Height="100%" AutoGenerateColumns="false" DataKeyNames="ProjectName" OnRowEditing="TheGrid_RowEditing" OnRowUpdating="TheGrid_RowUpdating" AutoGenerateEditButton="true" OnRowCancelingEdit="TheGrid_RowCancelingEdit">
                    <Columns>
                        <asp:TemplateField HeaderText="Project" SortExpression="ProjectName">
                            <EditItemTemplate>
                                <asp:TextBox ID="ProjectNameText" runat="server" Text='<%#Bind("ProjectName") %>'></asp:TextBox>
                            </EditItemTemplate>
                            <ItemTemplate>
                                <asp:Label ID="ProjectNameLabel" runat="server" Text='<%#Bind("ProjectName") %>'></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="Estimate" SortExpression="ProjectEstiamte">
                            <EditItemTemplate>
                                <asp:TextBox ID="ProjectEstimateText" runat="server" Text='<%#Bind("ProjectEstimate") %>'></asp:TextBox>
                            </EditItemTemplate>
                            <ItemTemplate>
                                <asp:Label ID="ProjectEstimateLabel" runat="server" Text='<%#Bind("ProjectEstimate") %>'></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
                    </Columns>
                </asp:GridView>
            </div>
        </div>
    </form>
</body>
    
</html>


И код за ним:
using System;
using System.Data;
using System.Linq;
using System.Web.UI.WebControls;

namespace WebFormsProj
{
    public partial class AnittyGriddy : System.Web.UI.Page
    {      
        protected DataTable GridSource {
            get { return (DataTable)ViewState["gridsource"]; }
            set { ViewState["gridsource"] = value; }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ConstructInitialGridSource();
            }
            BindGrid();
        }

        private void ConstructInitialGridSource()
        {
            var table = new DataTable();
            table.Columns.Add(new DataColumn("ProjectName", typeof(string)));
            table.Columns.Add(new DataColumn("ProjectEstimate", typeof(int)));
            table.PrimaryKey = new DataColumn[] { table.Columns[0] };
            var row = table.NewRow();
            row[0] = "Alfa";
            row[1] = 100;
            table.Rows.Add(row);
            GridSource = table;
        }

        private void BindGrid()
        {
            TheGrid.DataSource = GridSource;
            TheGrid.DataBind();
        }

        protected void ProjectDD_SelectedIndexChanged(object sender, EventArgs e)
        {
            var dropdown = (DropDownList)sender;
            var todisplayordo = dropdown.SelectedValue;
            switch (todisplayordo)
            {
                case "add":
                    {
                        var mytable = GridSource;
                        var thenew = mytable.NewRow();
                        thenew[0] = DateTime.Now.Ticks.ToString();
                        thenew[1] = 666;
                        mytable.Rows.Add(thenew);
                        GridSource = mytable;                        
                        TheGrid.EditIndex = mytable.Rows.Count - 1;
                        BindGrid();
                        break;
                    }
                default:
                    {
                        //already databound to all
                        break;
                    }
            }
        }

        protected void TheGrid_RowEditing(object sender, GridViewEditEventArgs e)
        {
            TheGrid.EditIndex = e.NewEditIndex;
            TheGrid.DataBind();
        }

        protected void TheGrid_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            string keyField = e.Keys[0].ToString();
            var mytable = GridSource;
            var editRow = mytable.Rows.Find(e.Keys[0]);
            var keys = Request.Form.AllKeys;
            foreach (DataColumn clmn in mytable.Columns)
            {
                var idofclmn = keys.First(k => k.EndsWith(clmn.ColumnName + "Text"));
                editRow[clmn.ColumnName] = Request.Form[idofclmn];
            }
            GridSource = mytable;
            TheGrid.EditIndex = -1;
            BindGrid();
        }

        protected void TheGrid_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            TheGrid.EditIndex = -1;
            TheGrid.DataBind();
        }
    }
}


Member 11666220

Спасибо за ваше советую. Я прочитаю записку от Линка, которую вы предлагаете. Вы правы насчет того, что я работаю с веб-формами. На самом деле я хочу разместить изображение своей формы на этом форуме. Но я не знаю, как это опубликовать. Я хотел бы объяснить это с помощью изображения.

Member 11666220

Я улучшил свой вопрос выше. Я надеюсь, что вы поймете проблему в моей системе. Большое спасибо за ответ на мой вопрос. :)

Member 11666220

Спасибо за ваше советую. Я попробую код, который вы даете, и дам обратную связь позже. :)

Member 11666220

Решение, которое вы предоставили, очень полезно, но есть некоторые проблемы с моей кнопкой обновления. Значение, которое пользователь вставляет в режиме редактирования, не может быть обновлено. Ценю за совет.

Thomas Nielsen - getCore

Проблема с кнопкой обновления в моем примере или в коде, который вы указали в вопросе? Обратите внимание, что RowEditing на самом деле является обратной связью, которая заставляет ваш GridView изменять элементы управления, устанавливая индекс редактирования, и что сетка прошла загрузку страницы до выполнения метода события, это также похоже на вас? Понаблюдайте за коллекцией Request.Form.Keys и посмотрите, как фактические элементы управления шаблоном редактирования "за сценой" имеют несколько иные имена, чем вы могли бы ожидать