לחיצה על Enter ב-ASP.NET

gilad g

New member
לחיצה על Enter ב-ASP.NET

יש לי WebForm פשוט, עם Event Handler שמקושר ל-OnClick של כפתור שיש על אותו טופס. הבעיה שלי היא שכשלוחצים על הכפתור כדי לעשות סאבמיט, ה-Event נזרק, והכל בסדר, א-ב-ל כשלוחצים Enter כדי לעשות submit לטופס - יש PostBack (כלומר הדפדפן עושה Submit), אבל ה-event של הכפתור (onclick) לא מופעל
יש רעיונות
 

tberger

New member
מעניין

ניסיתי אצלי ודוקא כן עובד. אולי יש לך כמה EVENTS והוא לא יודע את מה להפעיל?
 

tberger

New member
האם אתה בטוח שמתבצע PostBack?

איך אתה יודע זאת? מה שגיליתי אצלי הוא שכאשר ה Button הוא האלמנט הראשון בדף מתבצע PostBack ושגרת הטיפול ב Click מופעלת, כאשר יש משהו לפני ה Button, אפילו שורה ריקה, לא מתבצע PostBack בכלל. כל זאת אם יש Page_Load וגם אם אין.
 

gilad g

New member
אני בטח שמתבצע פוסטבאק.

שומעים את ה"טיק" של IE
 

SGVB

New member
לא בטוח (Admini ממחשב אחר)

אולי הוא שולח את הטופס סתם ולא שולח את ה-PostBack
 

tberger

New member
לדעתי זה משהו שקשור בצד לקוח

מהבדיקות שעשיתי אם הדף מתחיל מייד ב FORM כלומר אין אפילו HEAD ו BODY מתבצע PostBack והארוע מופעל. אם יש משהו לפני אפילו BR אז לא. אני לא כל כך מכיר צד לקוח אבל זהו הכיוון. תבדוק אם גם אצלך זה כך. הערה: עבדתי עם NOTEPAD ולא עם VS כי אין לי במחשב הנוכחי.
 

tberger

New member
בשביל לבדוק

עזבתי את ASP.NET ועברתי ל HTML. בניתי קובץ פשוט ביותר
<form action="btn.htm" > <input type="submit"> </form>​
הכפתור מופיע עם BORDER מודגש וניתן לעשות SUBIT ע"י ENTER. כאשר מוסיפים משהו לפני ה FORM אפילו BODY אז הכפתור מופיע עם BORDER לא מודגש ו ENTER לא מבצע SUBMIT. האם מישהו מבין למה? האם מישהו יכול לבדוק גם אצלו ולאשר שאכן זה נכון?
 

yuval k

New member
מבחינה לוגית...

זה נכון. כשפותחים את הדף, אז יש קונטרול שהוא default - בד"כ הראשון, והוא מסומן. השערה פרועה ומוגזמת לחלוטין - נסו לשים tabindex=0 (או 1, ממה שזה לא מתחיל
) לכפתור הסיבמוט. זה פיקס אותו
 

gilad g

New member
זה לא קשור ../images/Emo13.gif

בפעם המיליון: הטופס מסתבמט. הבעיה היא בצד"ש.
 

gilad g

New member
../images/Emo12.gif

טוב, טוב, לא צריך להתעצבן...
Code Front (מה המילה של זה
):
<%@ Page language="c#" Codebehind="WebForm2.aspx.cs" AutoEventWireup="false" Trace="True" Inherits="WebTest.WebForm2" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm2</title> <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="WebForm2" method="post" runat="server"> <asp:Label id="Label1" style="Z-INDEX: 101; LEFT: 129px; POSITION: absolute; TOP: 139px" runat="server" Width="214px" Height="10px">Label</asp:Label> <asp:TextBox id="TextBox1" style="Z-INDEX: 102; LEFT: 34px; POSITION: absolute; TOP: 44px" runat="server"></asp:TextBox> <asp:Button id="Button1" style="Z-INDEX: 103; LEFT: 263px; POSITION: absolute; TOP: 50px" runat="server" Text="Button" TabIndex="0"></asp:Button> </form> </body> </HTML>​
וה-Code Behind:
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; namespace WebTest { /// <summary> /// Summary description for WebForm2. /// </summary> public class WebForm2 : System.Web.UI.Page { protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.TextBox TextBox1; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here Response.Write("Page_Load"); } protected override void RaisePostBackEvent(IPostBackEventHandler sc, string ea ) { base.RaisePostBackEvent(sc, ea); Trace.Write(sc.ToString()); Trace.Warn(ea); } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); } /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.Button1.Click += new System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void Button1_Click(object sender, System.EventArgs e) { Label1.Text = "Hello " + TextBox1.Text; } } }​
זה טופס פשוט מאוד... אפילו הכי פשוט שיש
 

gilad g

New member
אה, כן

המתודה הזאת:
protected override void RaisePostBackEvent(IPostBackEventHandler sc, string ea ) { base.RaisePostBackEvent(sc, ea); Trace.Write(sc.ToString()); Trace.Warn(ea); }​
היא רק כדי לראות איזה פקד בטופס "הצית" את ה-Events.
 

tberger

New member
לחיצה על ה ENTER

לא מזוהה כלחיצה על הכפתור ולכן לא נעשה בכלל זיהוי שהיתה לחיצה ולא מופעל ה EVENT HANDLER. הפתרון שמצאתי הינו להוסיף את ה Button1_Click לארוע Page.Load וב Event Handler לבדוק האם מבוצע PostBack. מעניין איך בדיוק הוא מוציא מהמידע שחוזר מהלקוח מה נלחץ? האם אתה יודע? הנה ה CodeBehind - בWebForm אין שינוי.
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; namespace WebTest { /// <summary> /// Summary description for WebForm2. /// </summary> public class WebForm2 : System.Web.UI.Page { protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.TextBox TextBox1; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here Response.Write("Page_Load"); } protected override void RaisePostBackEvent(IPostBackEventHandler sc, string ea ) { base.RaisePostBackEvent(sc, ea); Trace.Warn(sc.ToString(),"ffffffffffff"); Trace.Warn(ea,"gggggggggg"); } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); } /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.Button1.Click += new System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load); this.Load += new System.EventHandler(this.Button1_Click); } #endregion private void Button1_Click(object sender, System.EventArgs e) { if (Page.IsPostBack) Label1.Text = "Hello " + TextBox1.Text; } } }​
 

gilad g

New member
../images/Emo4.gif

זה פתרון קצת עקום... ומה אם עשיתי פוסטבק מכפתור אחר
"מעניין איך בדיוק הוא מוציא מהמידע שחוזר מהלקוח מה נלחץ? האם אתה יודע?" אין לי מושג, וזה ממש ממש מסתורי
 

tberger

New member
זהו פתרון למצב שהצגת

קצת עקום אבל פועל. במקרה של שני כפתורים הרי לא תלחץ על ENTER כי הרי לא תוכל לדעת מי נלחץ ואז אין בכלל בעייה. כנראה הם לא חשבו על מצב בו ירצו ללחוץ על ENTER.
 

gilad g

New member
קשה לי להאמין שהם לא חשבו

על מצב כזה... הרי על כל כך הרבה מצבים מייקרוסופט כן חשבו, ודווקא את זה הם פיספסו
מילא. אולי סקריפ צד-לקוח יפתור את הבעיה
 
למעלה