ASP.net предотвращает щелчок строки сетки в режиме редактирования

У меня есть проблема с ASP.net Gridview, и я надеюсь, что люди здесь смогут мне помочь.

Требования

  • Gridview всю строку, чтобы можно было щелкнуть, чтобы открыть другую страницу
  • В режиме редактирования можно изменять значения таблицы через текстовое поле edititemtemplate.

Проблема

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

ASP-страница

<asp:GridView ID = "remarksGV1" runat = "server" AllowPaging = "true" DataKeyNames = "REM_ID"
            OnRowDataBound = "remarksGV1_RowDataBound" OnSelectedIndexChanged = "remarksGV1_SelectedIndexChanged"
            OnRowEditing = "remarksGV1_RowEditing"
            OnRowCancelingEdit = "remarksGV1_RowCancelingEdit"
            OnRowUpdating = "remarksGV1_RowUpdating"
            AutoPostBack = "false"
            HeaderStyle-CssClass = "thead-dark"
            CssClass = "table table-striped thead-dark table-borderless table-hover border-0 hand"
            AutoGenerateColumns = "false">
            <Columns>
                <asp:TemplateField HeaderText = "No.">
                    <ItemTemplate>
                        <%# Container.DataItemIndex + 1 %>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText = "Title">
                    <ItemTemplate>
                        <asp:Label ID = "titleLbl" runat = "server" Text='<%# Bind("REM_TITLE") %>' />
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:TextBox ID = "titleTB" runat = "server" />
                    </EditItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField = "REM_DESC" HeaderText = "Remarks Description" ReadOnly = "true" />
                <asp:BoundField DataField = "CREATE_DATE" DataFormatString = "{0:d}" HeaderText = "Date Created" ReadOnly = "true" />
                <asp:BoundField DataField = "UPD_DATE" DataFormatString = "{0:d}" HeaderText = "Last Updated" ReadOnly = "true" />
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:Button Text = "Edit" ID = "EditBtn" CssClass = "btn-action" runat = "server" CommandName = "Edit" />
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:Button Text = "Update" ID = "UpdateBtn" CssClass = "btn-action" runat = "server" CommandName = "Update" />
                        <asp:Button Text = "Cancel" ID = "CancelBtn" CssClass = "btn-action" runat = "server" CommandName = "Cancel" />
                    </EditItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>

Код позади

private void BindGrid()
    {
        Debug.WriteLine("BindGrid called");

        int proj_code = Int32.Parse(ViewState["proj_cd"].ToString());

        ProjectRepository remarksRepository = new ProjectRepository();
        var remarks = remarksRepository.GetRemarks(proj_code, proj_task_code, proj_stask1_cd, proj_stask2_cd);
        remarksGV1.DataSource = remarks;
        remarksGV1.DataBind();
    }

    protected void Unnamed_Click(object sender, EventArgs e)
    {
        Launch.PageEvent(this, (LinkButton)sender, ViewState["proj_cd"].ToString());
    }

    protected void remarksGV1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        try
        {
            switch (e.Row.RowType)
            {
                case DataControlRowType.Header:
                    //...
                    break;
                case DataControlRowType.DataRow:
                    e.Row.Attributes.Add("onclick", Page.ClientScript.GetPostBackEventReference(remarksGV1, "Select$" + e.Row.RowIndex.ToString()));
                    break;
            }
        }
        catch
        {
            //...throw
        }

        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            TextBox titleTB = (e.Row.FindControl("titleTB") as TextBox);

            int prj_cd = Int32.Parse(ViewState["proj_cd"].ToString());
            ProjectRepository repository = new ProjectRepository();
            var remarks = repository.GetRemarks(prj_cd, proj_task_code, proj_stask1_cd, proj_stask2_cd);
            Debug.WriteLine("Remarks Count: " + remarks.Count);
            TMS_PROJ_REMARK remark = remarks.First(x => x.REM_ID == Convert.ToInt64(DataBinder.Eval(e.Row.DataItem, "REM_ID")));

            if (titleTB != null)
            {
                titleTB.Text = remark.REM_TITLE;
            }
        }
    }

    protected void remarksGV1_SelectedIndexChanged(object sender, EventArgs e)
    {
        int row = remarksGV1.SelectedIndex;
        long rem_id = (long)remarksGV1.DataKeys[row]["REM_ID"];
        Debug.WriteLine("REM ID: " + rem_id);

        Session["edit_remarks"] = true;
        Dictionary<string, string> pairs = new Dictionary<string, string>();
        pairs["rem_id"] = rem_id.ToString();
        pairs["proj_cd"] = ViewState["proj_cd"].ToString();
        Launch.ToPage(this, "Project_Remarks_In_2.aspx", pairs);
    }

    protected void btnAddRemarks_Click(object sender, EventArgs e)
    {
        Session["new_remarks"] = true;
        Dictionary<string, string> pairs = new Dictionary<string, string>();
        pairs["proj_cd"] = ViewState["proj_cd"].ToString();

        string url = "Project_Remarks_In_1.aspx";

        Launch.ToPage(this, url, pairs);
    }

    private void SetTitle()
    {
        ProjectRepository repository = new ProjectRepository();
        TMS_PROJ_MASTER project = repository.GetProject(Convert.ToInt32(ViewState["proj_cd"]));
        this.Title = "Remarks - " + project.PROJ_TITLE;
    }

    protected void remarksGV1_RowEditing(object sender, GridViewEditEventArgs e)
    {
        remarksGV1.EditIndex = e.NewEditIndex;
        BindGrid();
    }

    protected void remarksGV1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        // Do stuff
        ProjectRepository repository = new ProjectRepository();
        GridViewRow row = remarksGV1.Rows[e.RowIndex];
        TextBox titleTB = (row.FindControl("titleTB") as TextBox);

        long rem_id = Convert.ToInt64(remarksGV1.DataKeys[e.RowIndex].Value);
        var db = new THPEntities();
        TMS_PROJ_REMARK remark = db.TMS_PROJ_REMARK
            .First(x => x.REM_ID == rem_id);
        remark.REM_TITLE = titleTB.Text;
        remark.UPD_DATE = DateTime.Now;
        db.SaveChanges();

        // Bind Grid
        remarksGV1.EditIndex = -1;
        BindGrid();
    }

    protected void remarksGV1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {
        remarksGV1.EditIndex = -1;
        BindGrid();
    }
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
949
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предлагаю в этой части вашего кода не добавлять полный щелчок по строке при редактировании строки (я добавил один -if- для проверки редактирования).

 switch (e.Row.RowType)
            {
                case DataControlRowType.Header:
                    //...
                    break;
                case DataControlRowType.DataRow:
                    if ((e.Row.RowState & DataControlRowState.Edit) != DataControlRowState.Edit)
                           e.Row.Attributes.Add("onclick", Page.ClientScript.GetPostBackEventReference(remarksGV1, "Select$" + e.Row.RowIndex.ToString()));
                    break;
            }

Другие вопросы по теме