Как работает Control.Enabled? - PullRequest
0 голосов
/ 05 июля 2018

Я провел несколько дней, просматривая различные ресурсы, и все больше путаюсь. У меня есть несколько элементов управления в файле .aspx: кнопка редактирования, выпадающий список года и четыре вида сетки с текстовыми полями и выпадающими списками в них. Текстовые поля и выпадающие списки в видах сетки начинают отключаться. Когда пользователь нажимает кнопку редактирования, он должен включить. Это работает в первый раз, но они не будут отключены снова. Вот соответствующий код:

private void toggleEditMode()
{
    editBtn.CssClass = editBtn.Attributes["mode"].ToString() == "edit" ? "btn btn-success" : "btn btn-primary";
    editBtn.Text = editBtn.Attributes["mode"].ToString() == "edit" ? "<span class='glyphicon glyphicon-floppy-disk'></span>&nbsp;Save" : "<span class='glyphicon glyphicon-edit'></span>&nbsp;Edit";
    editBtn.Attributes["mode"] = editBtn.Attributes["mode"].ToString() == "edit" ? "save" : "edit";

    selectYear.Enabled = !selectYear.Enabled;
    foreach (GridView gv in panels)
    {
        foreach (GridViewRow gvr in gv.Rows)
        {
            TextBox name = (TextBox)gvr.FindControl("nameTB");
            DropDownList rating = (DropDownList)gvr.FindControl("ratingDDL");

            name.Enabled = !name.Enabled;
            rating.Enabled = !rating.
        }
    }
}

Кнопка редактирования правильно превращается в кнопку сохранения, а выпадающий список года корректно переключается, но текстовые поля и выпадающие списки в виде сетки не отключаются. Во время отладки я обнаружил, что свойство Enabled каждого текстового поля и DDL имеет значение false в начале этого метода.

Текстовые поля и все DDL start отключены, включаются нажатием кнопки, а затем не отключаются, даже если кнопка и год DDL переключаются правильно.

Мой вопрос: как именно работает свойство Enabled? Любая помощь с благодарностью.

РЕДАКТИРОВАТЬ: вот разметка:

<asp:LinkButton ID="editBtn" runat="server" ClientIDMode="Static" OnClick="ToggleEditMode" CssClass="btn btn-primary" mode="edit">
    <span class="glyphicon glyphicon-edit"></span>&nbsp;Edit
</asp:LinkButton>

<div class="form-inline" role="form">
    <fieldset>
        <div class="form-group">
            <label for="selectYear">Year:&nbsp;</label>
            <asp:DropDownList ID="selectYear" runat="server" CssClass="form-control" AutoPostBack="true" ClientIDMode="Static"></asp:DropDownList>
        </div>
    </fieldset>
</div>

А вот вид сетки:

<asp:GridView ID="jrSchools1a2aAdmin" runat="server" AutoGenerateColumns="false" GridLines="None" ClientIDMode="Static" OnRowCreated="BindRatings" CssClass="table table-striped table-bordered">
    <Columns>        
        <asp:TemplateField HeaderText="Name">
            <ItemTemplate>
                <asp:TextBox ID="nameTB" runat="server" Text='<%# Eval("name") %>' ClientIDMode="Static" schoolID='<%# Eval("schoolID") %>' Enabled="false" CssClass="form-control"></asp:TextBox>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Rating">
            <ItemTemplate>
                <asp:DropDownList ID="ratingDDL" runat="server"  SelectedValue='<%# Eval("rating") %>' ClientIDMode="Static" Enabled="false" CssClass="form-control"></asp:DropDownList>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="students" HeaderText="Students" />
        <asp:BoundField DataField="7_1" HeaderText="7-I" />
        <asp:BoundField DataField="7_2" HeaderText="7-II" />
        <asp:BoundField DataField="8_1" HeaderText="8-I" />
        <asp:BoundField DataField="8_2" HeaderText="8-II" />
        <asp:BoundField DataField="open" HeaderText="Open" />
        <asp:BoundField DataField="score" HeaderText="Score" />
    </Columns>
</asp:GridView>

ToggleEditMode проверяет, должен ли он сохранять или нет, запускает SQL-запрос, если он должен сохранить, и вызывает toggleEditMode().

РЕДАКТИРОВАТЬ 2: Вот где toggleEditMode() называется. Извините за путаницу. Это больше нигде не называется.

protected void ToggleEditMode(object sender, EventArgs e)
{
    if (editBtn.Attributes["mode"].ToString() == "save")
    {
        StringBuilder query = new StringBuilder();
        List<SQLParameter> parameters = new List<SQLParameter>();

        //Determine the year
        int year;
        int.TryParse(selectYear.SelectedItem.Value, out year);
        parameters.Add(new SQLParameter("@year", year));

        // Use a counter so we can enumerate parameter names
        int i = 0;
        foreach (GridView gv in panels)
        {
            foreach (GridViewRow gvr in gv.Rows)
            {
                TextBox name = (TextBox)gvr.FindControl("nameTB");
                DropDownList rating = (DropDownList)gvr.FindControl("ratingDDL");

                name.CssClass = "form-control green";

                //SQL statements here

                parameters.Add(new SQLParameter(String.Format("@name{0}", i), name.Text));
                parameters.Add(new SQLParameter(String.Format("@schoolID{0}", i), name.Attributes["schoolID"].ToString()));
                parameters.Add(new SQLParameter(String.Format("@rating{0}", i), rating.SelectedValue));

                i++;
            }
        }

        SqlConn.doQuery(query.ToString(), parameters);

        //populateTables();
    }
    toggleEditMode();
}

1 Ответ

0 голосов
/ 18 декабря 2018

Как и @mjw, упомянутый в комментариях, я устанавливал Enabled='false' в разметке. Из-за жизненного цикла страницы элементы управления всегда отображались как Enabled='false'. Если элементы управления можно включать / отключать в зависимости от условий, это лучше всего обрабатывать в функции Page_Load. Тем не менее, ASP.NET имеет возможности редактирования, встроенные в элемент управления GridView, и они должны быть предпочтительнее, чем представления AJAX для неотъемлемых преимуществ безопасности, встроенных в ASP.NET. Вот несколько ссылок для начала:

Создание редактируемого столбца в ASP.net GridView

https://docs.microsoft.com/en-us/previous-versions/dotnet/articles/ms972948(v=msdn.10)

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