2008-11-17 11 views
6

मुझे एक वेब एप्लिकेशन मिला, समस्या यह है कि लेबल में टेक्स्ट पहले क्लिक पर अपडेट नहीं होगा, मुझे दो बार बटन क्लिक करने की आवश्यकता है, मैं कोड को डिबग, और मुझे पता चला है कि लेबल दूसरा क्लिक के बाद जब तक डेटा recive नहीं करता है,एएसपी.नेट सी #, कुछ होने के लिए दो बार बटन दबाए जाने की आवश्यकता है

यहाँ मेरी कोड है:

System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand(); 
System.Data.SqlClient.SqlConnection connection; 
string CommandText; 
string game; 
string modtype; 
bool filter; 
protected void Page_Load(object sender, EventArgs e) 
{ 

    labDownloadList.Text = null; 

    //Session variables: 
    if (Session["Game"] != null) 
    { 
     game = Convert.ToString(Session["Game"]); 
    } 
    if (Session["ModType"] != null) 
    { 
     modtype = Convert.ToString(Session["ModType"]); 
    } 
    if (Session["FilterBool"] != null) 
    { 
     filter = Convert.ToBoolean(Session["FilterBool"]); 
    } 
    string ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\inetpub\\wwwroot\\stian\\App_Data\\Database.mdf;Integrated Security=True;User Instance=True"; 
    connection = new System.Data.SqlClient.SqlConnection(ConnectionString); 
    System.Data.SqlClient.SqlDataReader reader; 
    command = connection.CreateCommand(); 
    connection.Open(); 
    CommandText = "SELECT * FROM Command"; 
    if (filter) 
    { 
     CommandText = "SELECT * FROM Command WHERE Game='" + game + "' AND Type='" + modtype + "'"; 
    } 
    command.CommandText = CommandText; 
    reader = command.ExecuteReader(); 
    labDownloadList.Text = ""; 
    while (reader.Read()) 
    { 
     string game = reader.GetString(1); 
     string author = reader.GetString(2); 
     string downloadlink = reader.GetString(3); 
     string size = reader.GetString(4); 
     string description = reader.GetString(5); 
     string version = reader.GetString(6); 
     string screenshotlink = reader.GetString(7); 
     Int64 AmountDownloaded = reader.GetInt64(8); 

     labDownloadList.Text += "Game: " + game + "<br>"; 
     labDownloadList.Text += "Author: " + author + "<br>"; 
     labDownloadList.Text += "Size: " + size + "<br>"; 
     labDownloadList.Text += "Description: " + description + "<br>"; 
     labDownloadList.Text += "Version: " + version + "<br>"; 
     labDownloadList.Text += "<img src='" + screenshotlink + " /><br>"; 
     labDownloadList.Text += "Downloaded: " + AmountDownloaded + " times<br><hr>"; 
     labDownloadList.Text += "<a href='" + downloadlink + "'>Download</a><br>"; 
    } 
} 

protected void Page_UnLoad(object sender, EventArgs e) 
{ 
    Session["Game"] = game; 
    Session["ModType"] = modtype; 
    Session["FilterBool"] = filter; 
    connection.Close(); 
} 

protected void btnFilter_Click(object sender, EventArgs e) 
{ 
    game = lstGames.SelectedValue; 
    modtype = lstTypeMod.SelectedValue; 
    filter = true; 
} 
+0

कुछ OT टिप्पणियाँ: - आप Convert.ToString (सत्र [ "खेल"]) क्या करने की जरूरत नहीं है। सत्र [नाम] एक वस्तु है इसलिए आपको इसे वापस डालना होगा: (स्ट्रिंग) सत्र ["गेम"] - आपको पैरामीर्टिज्ड एसक्यूएल में देखना चाहिए क्योंकि आप इंजेक्शन हमलों के लिए बहुत खुले हैं –

+0

निश्चित रूप से पैरामीटरयुक्त एसक्यूएल में देखें। –

उत्तर

11

बहुत स्पष्ट होना। Page_Load ईवेंट के बाद बटन क्लिक ईवेंट होता है जिसका अर्थ है कि पहली पोस्टबैक पर फ़िल्टरिंग लागू नहीं होती है। इसे दूसरी पोस्टबैक पर अपडेट किया गया है और आप फ़िल्टरिंग देखते हैं। अपने कोड को काम करने के लिए सबसे आसान परिवर्तन अपने पेज_लोड ईवेंट में सभी कोड को ऑनपेरेंडर में स्थानांतरित करना है ताकि बटन क्लिक ईवेंट के बाद पुनः लोड हो।

एक क्लीनर समाधान हालांकि इसे लोडडाटा फ़ंक्शन में स्थानांतरित करने के लिए संभव है और इसे पृष्ठ लोड पर कॉल करें जब यह पोस्टबैक न हो और इसे अपने फ़िल्टर अपडेट करने के बाद बटन पर क्लिक करें। यही कारण है कि किसी भी पोस्टबैक पेज चक्र है कि डेटा को फिर से लोड की जरूरत नहीं है पर डेटाबेस के लिए एक कॉल कर पाएगा:


protected void Page_Load(object sender, EventArgs e) 
{  
    if (!Page.IsPostBack) 
     { 
      LoadData() 
     } 
} 

private void LoadData() 
{ 
    labDownloadList.Text = null; 
    //Session variables:  
    if (Session["Game"] != null) 
    ... 
} 

protected void btnFilter_Click(object sender, EventArgs e) 
{  
    game = lstGames.SelectedValue; 
    modtype = lstTypeMod.SelectedValue; 
    filter = true; 
    LoadData(); 
} 

एक उभरते ASP.Net डेवलपर के लिए त्वरित सलाह का एक टुकड़ा पिछले अच्छी तरह से पेज जीवन चक्र सीखना है। किसी पृष्ठ पर घटनाओं के अनुक्रम को जानना आवश्यक है। शुभ लाभ।

2

मैं ठेठ

if (!Page.IsPostBack) 
{ 
    ... 
} 
दिखाई नहीं दे रहा

आपके पेज_लोड विधि में , जिसका अर्थ यह है कि जब भी पृष्ठ लोड होता है तो आपका डेटाबंडिंग तब होता है, जो आपकी समस्या का कारण बनता है। मैं कोड को जोड़ने का सुझाव देता हूं और देखता हूं कि यह समस्या हल करता है या नहीं।

6

बटन क्लिक करें ईवेंट हैंडलर पेज_लोड के बाद होते हैं। इसके बजाय Page_LoadComplete का उपयोग करने का प्रयास करें।

तो, आपके कोड में, बटन क्लिक होने के बाद, पृष्ठ_लोड ईवेंट डेटा को फायर और सेट करता है, फिर btnClick ईवेंट आग और डेटा को बदल देता है। लेकिन, डेटा पहले से ही पुराने रूप में बाध्य था। यही कारण है कि इसे काम करने के लिए 2 क्लिक लगते हैं।

यदि आप उसी पृष्ठ_लोड कोड को पृष्ठ_लोडकंपलेट ईवेंट में डालते हैं, तो यह btnClick ईवेंट के बाद होगा। वह वांछित परिणाम का उत्पादन करना चाहिए।

7

Page Life Cycle का माइक्रोसॉफ्ट का अवलोकन प्रवाह (और आपकी समस्या का समाधान) को समझने में सहायक हो सकता है।

+1

यह एक अच्छा लेख है, मैं लगातार लोगों को इसका संदर्भ देता हूं –

1

जैककॉम, समाधान काम किया! धन्यवाद। और मैं पृष्ठ जीवन चक्र का अध्ययन करूंगा। मुझे जोड़ना होगा, कि मुझे केवल सॉफ्टवेयर विकास में अनुभव है, मैंने अभी इस शरद ऋतु के वेब विकास के साथ शुरुआत की है।

0

मैं इस बारे में लगभग एक सप्ताह तक अटक गया था। अंत में, मैंने Button_Click ईवेंट TextChanged ईवेंट में कोड को पीछे रखा है और यह काम करता है। बटन दबाकर फोकस TextBox छोड़ देता है ताकि ईवेंट Button_click ईवेंट नहीं होने पर आग लग जाए। बहुत गुस्सा मुझे यह पसंद नहीं है।

मैं एक दिलचस्प लेख है कि वास्तव में मेरे लिए काम नहीं किया भर में आया है, लेकिन मुझे खुशी है कि मैं वैसे भी इसे पढ़ कर रहा हूँ: Enter and the Button Click Event

कि अन्य स्थितियों में काम कर सकते हैं।

0

एएसपी.Net कभी-कभी वास्तव में अजीब चीज़ों को कर सकता है।मुझे आज भी यही समस्या थी। मैंने पाया कि मैंने एक टेक्स्टबॉक्स पर एक ऑटोपोस्टबैक = "सही रखा था और भले ही वह जो भी चाहता था वह करने के लिए काम नहीं कर रहा था, फिर भी मैं ऑटोपॉस्टबैक को मार्कअप से बाहर ले जाना भूल गया। जब मैंने उसी तालिका पंक्ति में एक बटन क्लिक किया, पहले क्लिक ने दो पोस्टबैक किए, लेकिन बटन इवेंट को फायर नहीं किया। बटन पर क्लिक करने पर बटन पर क्लिक करने पर दूसरी बार बटन पर क्लिक किया गया। जब मुझे मार्कअप से अतिरिक्त ऑटोपोस्टबैक मिला, तो बटन इवेंट ने पहले क्लिक पर फायरिंग शुरू कर दी। एक सोचता है कि पाठ बॉक्स सिवाय इसके कि बटन क्लिक करें घटना पाठ बॉक्स की सामग्री को संदर्भित बटन से जुड़ा कोई रास्ता नहीं में था।

1

मैं अपने पन्ने पर एक ही समस्या थी। हर बार जब मैं था दो बार क्लिक करने के लिए यह काम करने के लिए प्राप्त करने के लिए यह कुछ टेक्स्टबॉक्स और ड्रॉपडाउनलिस्ट के कारण हुआ था जिसमें ऑटोपॉस्टबैक सही है। ओ nce मैंने ऑटोपॉस्टबैक को हटा दिया, यहां तक ​​कि चिकनी और एकल क्लिक ठीक से ट्रिगर हो गए।

0

मैं अच्छी तरह से इस बारे में पता नहीं है, लेकिन मेरे लिए यह चाल काम:

function pageLoad(sender, args) { 
    $(document).ready(function() { 
     //your stuff 
    }); 
    $(":button").each(function() { 
     $(this).click(); 
     //this is a trick; click one when page load, 
    }); 
} 
+0

हालांकि यह तकनीकी रूप से काम कर सकता है, क्या आप कोड देख सकते हैं और यह निर्धारित कर सकते हैं कि कोड पहले स्थान पर क्यों काम नहीं कर रहा है? –

संबंधित मुद्दे