簡體   English   中英

首次單擊ASP.NET控件不會在單擊事件上觸發

[英]First Click on ASP.NET control does not fire on click event

我在兩個頁面上都看到了這種行為,但是我只想問一下目前對我來說更重要的一個頁面。 我有一個頁面,可將信息從數據庫加載到ASP網格視圖中,然后允許用戶向每條填充的行中添加詳細信息。

我遇到的問題是,當gridview的“編輯”按鈕,然后是“更新”或“取消”按鈕時,需要兩次單擊才能真正觸發onclick事件。 第一次點擊確實發生了回發,但實際上沒有任何反應。

我包括下面似乎相關的代碼。 該頁面使用母版頁,並且格式化涉及多個div,但我不包括這些。

Gridview和相關控件:

<asp:UpdatePanel runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:Label Text="Plant Selector:  " runat="server" />
        <asp:DropDownList ID="ddlPlant" OnSelectedIndexChanged="ddlPlant_SelectedIndexChanged" runat="server" />
        <asp:Button ID="btnUpdate" Text="Update" OnClick="btnUpdate_Click" runat="server" />
        <p />
        <asp:Label ID="lblTest" Text="" runat="server" />
        <asp:Label ID="lblerror" Text="" ForeColor="Red" runat="server" />
        <asp:GridView ID="gridview1" AutoGenerateColumns="false" runat="server" OnRowEditing="gridview1_RowEditing" OnRowCancelingEdit="gridview1_RowCancelingEdit" OnRowUpdating="gridview1_RowUpdating">
            <Columns>
                <asp:BoundField DataField="JobNum" HeaderText="Job Number" ReadOnly="true" />
                <asp:BoundField DataField="ModelNum" HeaderText="Model" ReadOnly="true" />
                <asp:BoundField DataField="Customer" HeaderText="Customer" ReadOnly="true" />
                <asp:BoundField DataField="SchCompDate" HeaderText="Sch Comp Date" ReadOnly="true" />
                <asp:TemplateField HeaderText="Details">
                    <EditItemTemplate>
                        <asp:TextBox ID="Txt" Width="98%" runat="server" />
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label Text="Click Edit to add details of exception." runat="server" />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:CommandField ShowEditButton="true" />
            </Columns>
       </asp:GridView>
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="gridview1" />
    </Triggers>
</asp:UpdatePanel>

下面的示例圖片:

示例GridView顯示

這是背后的代碼:

private string Plant { get; set; }

// This sets the default plant based off IP.
protected void Page_PreInit(Object sender, EventArgs e)
{        
    getPlantFromIP();
}

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        populateDDL();
        BindData();
    }
    else
    {
        Plant = ddlPlant.SelectedValue.ToString();
    }
}

// Populates the drop down.
private void populateDDL()
{        
    ddlPlant.Items.Add("NC");
    ddlPlant.Items.Add("WA");

    setPlantInDDL();
}

private void setPlantInDDL()
{
    if(Plant == "WA")
    {
        ddlPlant.SelectedIndex = 1;
    }
    if (Plant == "NC")
    {
        ddlPlant.SelectedIndex = 0;
    }
}

private void getPlantFromIP()
{
    if (Request.ServerVariables["REMOTE_ADDR"] == "70.103.118.100")
    {
        Plant = "WA";
        //ddlPlant.SelectedIndex = 1;
    }
    else
    {
        Plant = "NC";
        //ddlPlant.SelectedIndex = 0;
    }
}

// Database Query.
private DataTable getDataFromDatabase()
{
    DataTable rTable = new DataTable();

    string plant = ddlPlant.SelectedValue.ToString();

    using (var conn = new MySqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["workorderConnectionString"].ConnectionString))
    {
        conn.Open();
        using (var cmd = conn.CreateCommand())
        {
            try
            {
                cmd.CommandText = @"SELECT * FROM reportdatatables.compliance_exception_report
                                    WHERE ExceptionNoted = '0' AND Plant = @plant";
                cmd.Parameters.AddWithValue("@plant", plant);

                MySqlDataReader reader = cmd.ExecuteReader();

                rTable.Load(reader);
                reader.Close();
                cmd.Dispose();
            }
            catch
            {

            }
            finally
            {
                conn.Close();
            }
        }
    }

    return rTable;
}

// Binds the data from the database to the gridview.
private void BindData()
{        
    DataTable data = getDataFromDatabase().Copy();

    gridview1.DataSource = data;
    gridview1.DataBind();
}


protected void ddlPlant_SelectedIndexChanged(object sender, EventArgs e)
{
    //Plant = ddlPlant.SelectedValue.ToString();
    BindData();
}

// On edit call.
protected void gridview1_RowEditing(object sender, GridViewEditEventArgs e)
{

}

// On cancel call.
protected void gridview1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
    gridview1.EditIndex = -1;
}

protected void gridview1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{

}

protected void btnUpdate_Click(object sender, EventArgs e)
{
    BindData();
}

這是我嘗試過的:

-閱讀的很多文章都看到了與控件的自動回發設置有關的行為。 如您所見,我確保將autopostback設置為true時沒有任何控件。

-我擔心該行為可能與updatepanel有關,但是刪除它根本不會改變該行為。

-我讀到您的頁面標簽中包含AutoEventWireup =“ true”可能會導致這種情況。 我的頁面標簽中確實包含該標簽,但是將其設置為false並不能解決問題,並且可以防止頁面加載時填充我的下拉菜單。

-還有另一則帖子暗示該控件的ID可能會在頁面加載和發帖之間進行更改。 我監視了這些控件的ID,但看不到它們的ID發生任何變化。

綜上所述,我希望有人能對我所缺少的有所了解。 如果我能提供更多信息可能會有所幫助,請告訴我。

先感謝您。

試試這個,這將使網格可編輯

protected void gridview1_RowEditing(object sender, GridViewEditEventArgs e)
{
   GridView1.EditIndex = e.NewEditIndex;
   BindData();
}

也取消

protected void gridview1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
    gridview1.EditIndex = -1;
    BindData();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM