Кнопка Fires Twice - 2 записи вставлены в базу данных - PullRequest
1 голос
/ 01 февраля 2011

Запуск в MasterPage с AutoEventWireup = true.Я не могу изменить это.Кнопка вставляет новую запись в базу данных.
При нажатии кнопки вставляются две записи.

  <asp:Button ID="AddLab" Text="Add Lab" OnClick="AddLab_OnClick" CssClass="btn" runat="server" />

PageDirective:

    AutoEventWireup="true"  <- I have tried removing this, setting to false.

PageLoad / PreRender показывает, что здесь ничего не делается с помощью кнопки:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DbDataReader ddrGrp = rdoGroups();
            if (ddrGrp.HasRows)
            {
                rdoGroup.DataSource = ddrGrp;
                rdoGroup.DataBind();
            }
            ddrGrp.Close();
            // preset filter by lab to true
            CheckBox FiltLabs = (CheckBox)CommonUI.FindCtrlRecursive(this.Master, "FiltLabs");
            FiltLabs.Checked = true;
        }

    }

    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);
        // nothing yet
        rdoLabs.Items.Clear();
        DbDataReader ddrLab = rdoUserLabs();
        if (ddrLab.HasRows)
        {

            rdoLabs.DataSource = ddrLab;
            rdoLabs.DataBind();
            if (CommonUI.strTest((string)Session["rdoLabs"]))
            {
                if (Convert.ToInt32(Session["rdoLabs"]) > 0)
                {
                    rdoLabs.SelectedValue = (string)Session["rdoLabs"];
                }
            }
        }
        ddrLab.Close();
        // get group-lab mappings
        cboGroupLab.Items.Clear();
        DbDataReader ddrGroupLab = cboGroupLabsMap();
        if (ddrGroupLab != null)
        {
            if (ddrGroupLab.HasRows)
            {

                cboGroupLab.DataSource = ddrGroupLab;
                cboGroupLab.DataBind();
            }
        }
    }

    protected void AddLab_OnClick(object sender, EventArgs e)
    {
        LabAdmn labAdd = new LabAdmn();
        TextBox txtLab = (TextBox)CommonUI.FindCtrlRecursive(this.Master, "txtLab");
        CheckBox Active = (CheckBox)CommonUI.FindCtrlRecursive(this.Master, "cboLabActive");
        string[] strArr = new string[] { "lab_id" };
        labAdd.LabName = txtLab.Text;
        labAdd.Active = (bool)Active.Checked;
        // AddLab is where record is fired...see below...
        Hashtable ht = labAdd.AddLab(labAdd, strArr);
        ht = labAdd.AddLab(labAdd, strArr);
        if (ht != null)
        {
            HiddenField hLabId = (HiddenField)CommonUI.FindCtrlRecursive(this.Master, "hLabId");
            hLabId.Value = Convert.ToString(GetHTParm(ht, strArr[0]));
        }


    }
    #endregion AddLab_OnClick

    #region AddLab
    public Hashtable AddLab(LabAdmn labAdmn, string[] colOutputNames)
    {
        DAL myDal = new DAL(DBType, DB);
        Hashtable ht = new Hashtable();
        DAL.Parameters[] parms = new DAL.Parameters[]
        {
            new DAL.Parameters("driver_id","A",ParameterDirection.Input),
            new DAL.Parameters("lab_id",labAdmn.LabId,ParameterDirection.InputOutput),
            new DAL.Parameters("active",labAdmn.Active,ParameterDirection.Input),
            new DAL.Parameters("lab_name",labAdmn.LabName,ParameterDirection.Input)
        };
        CommandType cmdType = CommandType.StoredProcedure;
        string cmdText = "asp_Labs_Admin";
        ht = myDal.ExecuteQueryOutput(cmdType, cmdText, colOutputNames, parms, true);
        return ht;

    }
    #endregion AddLab

Я прочитал это onclick иРунат вызывает двойную обработку.Если я удалю runat, кнопка не будет отображаться, поскольку это кнопка на стороне сервера.Если удалить событие OnClick, оно никогда не сработает независимо от того, имеет ли значение AutoEventWireup значение true, false или удалено.

Ответы [ 3 ]

2 голосов
/ 01 февраля 2011

Похоже, вы вызываете метод AddLab дважды:

Hashtable ht = labAdd.AddLab(labAdd, strArr);
        ht = labAdd.AddLab(labAdd, strArr);
1 голос
/ 01 февраля 2011

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

Попробуйте удалить код с помощью кнопки и поместить его снова, без атрибута onclick в разметке.добавьте свою страницу или элемент управления в "oninit" после

AddLab.Click += this.AddLab_OnClick;

Но сначала попробуйте удалить атрибут разметки и повторите попытку, если она все еще срабатывает дважды

0 голосов
/ 01 февраля 2011

Можете ли вы переименовать метод AddLab_OnClick () во что-то другое и назначить его в обработчике OnClick = ""?Я думаю, что AutoEventWireup вызывает первое событие, а второе связано с назначением OnClick снова.

Также попробуйте то, что предложил Люк.Это докажет события назначения ..

...