C# asp. net флажок не срабатывает, если не отмечено - PullRequest
0 голосов
/ 19 марта 2020

Я нашел этот вопрос в нескольких местах, но не нашел решения ...

У меня есть флажок в виде сетки:

<asp:TemplateField HeaderText="Closed?">
    <ItemTemplate >
        <asp:CheckBox ID="Status_CB"  runat="server" AutoPostBack="true" 
            OnCheckedChanged="Status_CB_CheckedChanged" 
            EnableViewState="true" ViewStateMode="Enabled" 
            Checked='<%# Convert.ToString(Eval("cStatus")) == "1" ? true : false %>'/>
    </ItemTemplate>
</asp:TemplateField>

codebehind:

protected void Page_Load(object sender, EventArgs e) {
    if (!int.TryParse(Session["FacilityID"].ToString(), out FId)) {
        FId = 0;
    }
    if (!Page.IsPostBack) {
        if (!string.IsNullOrEmpty(Request.QueryString.Get("WorkCenter"))) {
            wc = Request.QueryString.Get("WorkCenter");
            WorkcenterHeader.InnerText = wc + " Schedule ";
            HiddenWorkCenter.Value = c;
        }
        if (!SQLHasData()) {
            SavePrioritiesToSQL();
        }
        BindGrid();
    }
}
protected void Status_CB_CheckedChanged(object sender, EventArgs e) {
    CheckBox cb = (CheckBox)sender;
    GridViewRow row = (GridViewRow) cb.Parent.Parent;
}

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

Чего мне не хватает, кто-нибудь знает?

ОБНОВЛЕНИЕ - вот таблица, это вложенный. Интересно, если это причина, по которой он не будет вызывать обратную передачу при снятии галочки ...

ОБНОВЛЕНИЕ - хорошо, я сдался, это должно быть ошибка с вложенным gridview в asp, так что если у вас есть вложенный gridview Я рекомендую не использовать флажки. Я переключил мое в текстовое поле cStatus "open" или "closed" и использую кнопку с аргументом команды, который является индексом строки:

<asp:GridView ID="JobInfo_GV" runat="server" AutoGenerateColumns="false" CssClass="ChildGrid2" OnRowCommand="JobInfo_GV_RowCommand">
<asp:BoundField DataField="cStatus" HeaderText="Status" ReadOnly="True" HeaderStyle-CssClass="center-row" ItemStyle-CssClass="center-row"/>  
<asp:TemplateField HeaderText="Update">
    <ItemTemplate >
      <asp:Button id="UpdateClosed" commandname="Select" buttontype="button" Text="ToggleStatus"  runat="server" CommandArgument='<%# Container.DataItemIndex %>'/>
    </ItemTemplate>
</asp:TemplateField>

, затем C#:

protected void JobInfo_GV_RowCommand(object sender, GridViewCommandEventArgs e) {
    var grid = (GridView)sender;
    var errorMessage = string.Empty;
    if (grid != null) {
        int index = 0;
        if (int.TryParse(e.CommandArgument.ToString(), out index) ){
        GridViewRow row = grid.Rows[index];

1 Ответ

1 голос
/ 19 марта 2020

Я только что создал проект и повторно использовал ваш код как часть его. Он работает так, как вы ожидаете:

Примечание вам необходимо установить AutoPostBack="true" для Checkbox элемента управления

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

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GV" runat="server" AutoGenerateColumns="false">
                <Columns>
                    <asp:BoundField DataField="Name" HeaderText="Name">
                    </asp:BoundField>
                    <asp:TemplateField HeaderText="Closed?">
                        <ItemTemplate>
                            <asp:CheckBox ID="Status_CB" runat="server" AutoPostBack="true"
                                OnCheckedChanged="Status_CB_CheckedChanged"
                                EnableViewState="true" ViewStateMode="Enabled"
                                Checked='<%# Convert.ToString(Eval("cStatus")) == "1" ? true : false %>' />
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
        </div>
    </form>
</body>
</html>

И код позади:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
                BindGrid();
        }

        public class DataS
        {
            public int cStatus { get; set; }
            public string Name { get; set; }
        }
        private void BindGrid()
        {
            List<DataS> list = new List<DataS>() { new DataS() { Name = "Name1", cStatus = 1 }, new DataS() { Name = "Name2", cStatus = 1 }, new DataS() { Name = "Name3", cStatus = 0 } };
            GV.DataSource = list;
            GV.DataBind();
        }

        protected void Status_CB_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox cb = (CheckBox)sender;
            GridViewRow row = (GridViewRow)cb.Parent.Parent;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...