2010-02-02 9 views
7

मेरे पास एक ग्रिड व्यू (टेम्पलेटफिल्ड के माध्यम से) के अंदर एक लिंकबटन है। कोई फर्क नहीं पड़ता कि मैं क्या कोशिश करता हूं, लिंकबटन अपने इवेंट हैंडलर को नहीं बुलाएगा।ग्रिड व्यू के अंदर मेरा लिंकबटन क्यों नहीं होगा ऑनक्लिक ईवेंट बढ़ाएगा?

  1. एक परंपरागत ईवेंट हैंडलर ("onclick") GridView स्तर पर
  2. एक OnRowCommand ईवेंट हैंडलर: मैं दोनों की कोशिश की है।

दोनों मामलों में, मैंने डीबग किया है और यह ईवेंट हैंडलर को भी पकड़ नहीं लेता है।

यदि मैं पेज पर लिंकबटन को बाहर ले जाता हूं (इसलिए यह ग्रिड व्यू में नहीं है), तो यह ठीक काम करता है, इसलिए मुझे पता है कि वाक्यविन्यास सही है।

<asp:TemplateField> 
    <ItemTemplate> 
    <asp:LinkButton Text="Cancel" ID="DeleteButton" CausesValidation="false" OnClick="CancelThis" runat="server" /> 
    </ItemTemplate> 
<asp:TemplateField> 

दिलचस्प बात यह है कि अगर मैं पीछे कोड से "CancelThis" विधि निकालने के लिए, यह एक त्रुटि फेंकता है:

यहाँ "पारंपरिक" विधि है। तो मुझे पता है कि यह अपने इवेंट हैंडलर से अवगत है, क्योंकि यह संकलित होने पर इसे ढूंढता है।

यहाँ RowCommand विधि है:

<asp:TemplateField> 
    <ItemTemplate> 
    <asp:LinkButton Text="Cancel" ID="DeleteButton" CausesValidation="false" CommandName="CancelThis" runat="server" /> 
    </ItemTemplate> 
<asp:TemplateField> 

इस मामले में, GridView है:

OnRowCommand="GridView_RowCommand" 

यह postsback, लेकिन कभी संकेत घटना को ऊपर उठाने पर।

किसी भी विचार मैं यहाँ क्या याद कर रहा हूँ?

उत्तर

0

क्या आपके ग्रिड व्यू पर व्यूस्टेट चालू है? इसने मुझे कई बार पकड़ा है।

10

आप अपने GridView को बाध्यकारी कैसे कर रहे हैं? क्या आप डेटास्रोत नियंत्रण का उपयोग कर रहे हैं? यदि आप Page_Load के दौरान मैन्युअल रूप से बाध्यकारी हैं, तो यह संभव है कि ग्रिड हर राउंड ट्रिप को बाध्यकारी कर रहा है, इसलिए ईवेंट हैंडलर ठीक से पकड़ नहीं रहा है।

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

आप नमूना पोस्ट कर सकते हैं अपने मार्कअप साथ जाने के लिए कोड बाध्यकारी: यदि यह मामला है, आप की तरह कुछ का उपयोग करना चाहेंगे?

यदि आप वास्तव में समस्या को मजबूर करना चाहते हैं, तो आप ग्रिड पर रोडाटाबाउंड ईवेंट में हुक कर सकते हैं, बटन को मैन्युअल रूप से ढूंढ सकते हैं और कोड को पीछे कोड में जोड़ सकते हैं। कुछ की तरह:

मार्कअप टुकड़ा:

<asp:GridView ID="gvTest" runat="server" OnRowDataBound="gvTest_RowDataBound" /> 

कोड के पीछे:

protected void gvTest_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if(e.Row.RowType == DataControlRowType.DataRow) 
    { 
     //find button in this row 
     LinkButton button = e.Row.FindControl("DeleteButton") as button; 
     if(button != null) 
     { 
      button.Click += new EventHandler("DeleteButton_Click"); 
     } 
    } 
} 

protected void DeleteButton_Click(object sender, EventArgs e) 
{ 
    LinkButton button = (LinkButton)sender; 
    // do as needed based on button. 
} 

मुझे यकीन है कि क्या बटन का उद्देश्य है नहीं कर रहा हूँ, लेकिन यह एक पंक्ति बटन को हटाना है यह सोचते हैं, तो आप हो सकता है कि इस दृष्टिकोण को ईवेंट हैंडलर में नहीं लेना चाहें, आपके पास प्रश्न में पंक्ति तक सीधी पहुंच नहीं है, जैसे आप RowCommand ईवेंट का उपयोग करेंगे।

क्या कोई कारण है कि आप टेम्पलेट फ़ील्ड का उपयोग कर रहे हैं? बनाम ButtonField कहता है?यदि आप ButtonField का उपयोग करते हैं, तो आप RowCommand ईवेंट में हुक कर सकते हैं।

मार्कअप टुकड़ा:

<asp:GridView ID="gvTest" runat="server" OnRowCommand="gvTest_RowCommand"> 
    <columns> 
     <asp:buttonfield buttontype="Link" commandname="Delete" text="Delete"/> 
     .... 
    </columns> 
</asp:GridView> 

पीछे कोड:

  • RowCommandEvent
  • ButtonField class
  • :

    protected void gvTest_RowCommand(object sender, GridViewCommandEventArgs e) 
    { 
        if(e.CommandName == "Delete") 
        { 
         //take action as needed on this row, for example 
         int rowIndex = Convert.ToInt32(e.CommandArgument); 
         GridViewRow currentRow = (sender as GridView).Rows[rowIndex]; 
    
         //do something against the row... 
        } 
    } 
    

    आप इन विषयों में से कुछ पर MSDN डॉक्स परामर्श करने के लिए चाहते हो सकता है

संपादित करें:

ButtonField पर आपके प्रश्न का उत्तर देने के लिए - हाँ मैं क्यों आप अभी भी एक buttonfield के साथ सौदा नहीं कर सकता है नहीं दिख रहा। यहाँ एक टुकड़ा बाध्य पंक्ति डेटा दौरान buttonfield खोजने के लिए और इसे छिपाने के लिए है (अपरीक्षित लेकिन मुझे लगता है काम करेगा ...)

protected void gvTest_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     //let's assume your buttonfield is in column 1 
     // (you'd know this based on your markup...) 
     DataControlFieldCell cell = e.Row.Cells[1] as DataControlFieldCell; 
     if(cell != null) 
     { 
      ButtonField field = cell.ContainingField as ButtonField; 

      //based on your criteria, show or hide the button 
      field.Visible = false; 
      //or 
      field.Visible = true; 
     } 
    } 
} 
+0

एक ButtonField का उपयोग करना, वहाँ एक रास्ता प्रोग्राम के रूप में छिपाने या दिखाने के लिए है? मौजूदा पुनरावृत्ति में कुछ मूल्यों के आधार पर, मैं या कई बटन नहीं दिखा सकता हूं। मैंने जो कुछ भी पढ़ा, उसे कहा कि मुझे टेम्पलेटफिल्ड में एक मानक बटन पर स्विच करना पड़ा। मेरी वर्तमान विधि के साथ, मैं वर्तमान पुनरावृत्ति की जांच करने के लिए RowDataBound ईवेंट का उपयोग कर रहा हूं, बटन ढूंढ सकता हूं, और संभावित रूप से इसे छुपा सकता हूं। – Deane

+0

मुझे लगता है कि यह निश्चित रूप से संभव होगा। नमूना कोड संलग्न के साथ मेरा जवाब संपादित किया। –

-1
<button onclick="window.open('<%#Eval("ReportLinks")%>', '_blank');" title='<%#Eval("ReportLinks")%>'> Link</button> 
संबंधित मुद्दे