Member 13174280 Ответов: 2

Переменную форму на класс


две кнопки для проверки переменных
класс FlgBtn инициализируется, а переменная flg всегда имеет значение false

кнопка включения установлена на значение true ФЛГ
кнопка Test проверяет значение (оно должно было оставаться истинным)

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

<form id="form1" runat="server">
        
        <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>

        <div>
            <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                <ContentTemplate>
                    <asp:Button ID="Button1" runat="server" Text="Enable" onclick ="Enable"/>
                </ContentTemplate>
            </asp:UpdatePanel>

            <asp:UpdatePanel ID="UpdatePanel3" runat="server">
                <ContentTemplate>                   
                    <asp:Button ID="Button3" runat="server" Text="Test" OnClick = "Test" />                    
                </ContentTemplate>                
            </asp:UpdatePanel>

        </div>





namespace WebApplication1
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        private FlgButton flgbtn = new FlgButton();
        bool TestBtn;

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

        protected void Enable(object sender, EventArgs e)
        {
            flgbtn.SetFlg(true);
        }

        protected void Disable(object sender, EventArgs e)
        {
            flgbtn.SetFlg(false);
        }

        protected void Test(object sender, EventArgs e)
        {
            TestBtn = flgbtn.GetFlg();
        }
    }

    public class FlgButton
    {
        private bool flg;

        /*
        public FlgButton()
        {
            flg = false;
        }
        */

        public void SetFlg(bool value)
        {
            flg = value;
        }

        public bool GetFlg()
        {
            return flg;
        }
    }

2 Ответов

Рейтинг:
2

Member 13174280

спасибо за информацию, я не знаю механизмов ViewState

У меня есть добавить

EnableViewState="true"
на страницу

знак компилятора об ошибке

private FlgButton flgbtn = new FlgButton(ViewState, "flgbtn.");


Инициатор поля не может ссылаться на свойство, метод или нестатическое поле Control.ViewState.

Другой-это "]"
get { return (bool?)_viewState[_viewStatePrefix + "Flg"; }


этот тест не разрешим

get { return (bool?)_viewState[_viewStatePrefix + "Flg"] }

или
<pre>get { return (bool?)_viewState[_viewStatePrefix] + "Flg"; }


Richard Deeming

Это должно было быть опубликовано как комментарий к моему решению, а не как новое решение.

Я исправил свое решение.

Рейтинг:
1

Richard Deeming

Значение полей вашего класса не будет сохраняться между запросами, даже если вы используете UpdatePanel Для каждого запроса будет создан новый экземпляр класса, и он будет отброшен, как только ответ будет возвращен пользователю.

Если вы хотите сохранить данные между запросами, вам нужно хранить их по-другому. В этом случае лучшим вариантом будет использование ViewState.
Руководство для начинающих по просмотру состояния [^]

Напр.:

public partial class WebForm1 : System.Web.UI.Page
{
    private FlgButton flgbtn;
    
    public WebForm1()
    {
        flgbtn = new FlgButton(ViewState, "flgbtn.");
    }
    
    private bool TestBtn
    {
        get { return (bool?)ViewState["TestBtn"] ?? false; }
        set { ViewState["TestBtn"] = value; }
    }
    
    ...
}

public class FlgButton
{
    private readonly StateBag _viewState;
    private readonly string _viewStatePrefix;
    
    public FlgButton(StateBag viewState, string viewStatePrefix)
    {
        _viewState = viewState;
        _viewStatePrefix = viewStatePrefix;
    }
    
    private bool Flg
    {
        get { return (bool?)_viewState[_viewStatePrefix + "Flg"] ?? false; }
        set { _viewState[_viewStatePrefix + "Flg"] = value; }
    }
    
    public void SetFlg(bool value)
    {
        Flg = value;
    }
    
    public bool GetFlg()
    {
        return Flg;
    }
}