2011-06-06 18 views
30

मैं एक सुविधा को कार्यान्वित कर रहा हूं कि जब उपयोगकर्ता ग्रिड व्यू में पंक्ति में किसी भी बिंदु पर दबाता है तो पंक्ति का चयन करें बटन के बजाय चुना जाएगा।चयन बटन के बिना ग्रिड व्यू में पूर्ण पंक्ति का चयन कैसे करें?

enter image description here

कि लागू करने के लिए, मैं निम्नलिखित कोड का उपयोग कर रहा:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     // Set the hand mouse cursor for the selected row. 
     e.Row.Attributes.Add("OnMouseOver", "this.style.cursor = 'hand';"); 

     // The seelctButton exists for ensuring the selection functionality 
     // and bind it with the appropriate event hanlder. 
     LinkButton selectButton = new LinkButton() 
     { 
      CommandName = "Select", 
      Text = e.Row.Cells[0].Text 
     }; 

     e.Row.Cells[0].Controls.Add(selectButton); 
     e.Row.Attributes["OnClick"] = 
      Page.ClientScript.GetPostBackClientHyperlink(selectButton, ""); 
    } 
} 
ऊपर कोड के साथ

, निम्नलिखित समस्याएं हैं:

  • यह ठीक ही अगर काम करता है पृष्ठ के लिए EnableEventValidationfalse पर सेट है।
  • SelectedIndexChanged केवल Grid.DataBind() को पृष्ठ के लिए Page_Load में पोस्ट किया गया है (प्रत्येक पोस्टबैक में)।

क्या मैं कुछ गलत कर रहा हूं? क्या कोई बेहतर कार्यान्वयन है?


संपादित करें: EnableEventValidationtrue पर सेट होने पर, निम्न त्रुटि दिखाई देगा:

अमान्य पोस्टबैक या कॉलबैक तर्क। इवेंट सत्यापन को कॉन्फ़िगरेशन या <% @ पृष्ठ सक्षम करें EventValidation = "true"%> पृष्ठ में सक्षम किया गया है। सुरक्षा उद्देश्यों के लिए, यह सुविधा सत्यापित करती है कि पोस्टबैक या कॉलबैक ईवेंट के तर्क मूल रूप से उन्हें प्रदान किए गए सर्वर नियंत्रण से उत्पन्न होते हैं। यदि डेटा मान्य और अपेक्षित है, तो सत्यापन के लिए पोस्टबैक या कॉलबैक डेटा पंजीकृत करने के लिए क्लाइंटस्क्रिप्ट प्रबंधक। रजिस्ट्रारफॉरवेन्ट वैलिडेशन विधि का उपयोग करें।

उत्तर

46

आपको इसे प्रत्येक पोस्टबैक पर और न केवल डेटाबेस पर जोड़ना होगा। इसलिए आपको RowCreated-GridView का उपयोग करना चाहिए।

उदाहरण के लिए

(सी #):

protected void GridView1_RowCreated(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) { 
     e.Row.Attributes["onmouseover"] = "this.style.cursor='pointer';this.style.textDecoration='underline';"; 
     e.Row.Attributes["onmouseout"] = "this.style.textDecoration='none';"; 
     e.Row.ToolTip = "Click to select row"; 
     e.Row.Attributes["onclick"] = this.Page.ClientScript.GetPostBackClientHyperlink(this.GridView1, "Select$" + e.Row.RowIndex); 
    } 
} 

(वीबी।नेट):

Private Sub GridView1_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowCreated 
    If e.Row.RowType = DataControlRowType.DataRow Then 
     e.Row.Attributes("onmouseover") = "this.style.cursor='pointer';this.style.textDecoration='underline';" 
     e.Row.Attributes("onmouseout") = "this.style.textDecoration='none';" 
     e.Row.ToolTip = "Click to select row" 
     e.Row.Attributes("onclick") = Me.Page.ClientScript.GetPostBackClientHyperlink(Me.GridView1, "Select$" & e.Row.RowIndex) 
    End If 
End Sub 
+0

यह 'EnableEventValidation' को गलत पर सेट करने की समस्या का समाधान नहीं करता है। –

+0

@ टिम: मैंने सवाल संपादित किया, कृपया इसे जांचें। – Homam

+0

@ होमाम: क्या आपने मेरा कोड इस्तेमाल किया है और आपको अभी भी "अमान्य पोस्टबैक/कॉलबैक तर्क" मिल रहा है? मैं अपनी परियोजना में इस त्रुटि को पुन: पेश नहीं कर सकता, लेकिन इसके लिए एक और कारण हो सकता है। मेरे पास अब और जांच करने के लिए समय नहीं है। आप इसे रोकने के लिए [ClientScriptManager.RegisterForEventValidation] (http://msdn.microsoft.com/en-us/library/ms223397.aspx) का उपयोग कर सकते हैं। शायद [यह लिंक] (http://www.codeproject.com/KB/webforms/DoubleClickGridviewRow.aspx) मदद करता है। –

-2

, <asp:LinkButton> अपने <tr> ASPX में कोड के आसपास उपयोग करने का प्रयास LinkButton के CommandName='Select' और आइटम आदेश घटना में, इस आदेश की प्रक्रिया की स्थापना की और एक चयनित पंक्ति की शैली सेट!

+1

क्या आप वाकई टीडी के बीच एक linikbutton हो रही है और टीआर एक वैध पूरी तरह से शिकायत एचटीएमएल उत्पन्न करता है? –

+0

@ डेविड पाइरा: मानक अनुपालन एचटीएमएल का प्रश्न में एक आवश्यकता के रूप में उल्लेख नहीं किया गया था! यदि यह एक आवश्यकता है, तो समाधान स्वीकार न करें! मैंने कुछ संभावनाएं दिखाईं! – Nauman

+0

मैं असहमत हूं, मैंने आपको वोट नहीं दिया है और यदि मूल पोस्ट में उल्लेख नहीं किया गया है, तो भी हम ग्रीष्मकालीन 2011 (लगभग) में आते हैं, आइए क्रॉस ब्राउज़र और पूरी तरह से अनुपालन उत्तर दें :) ;-) –

3
<style type="text/css"> 
    .hiddenColumn 
    { 
     display: none; 
    } 

    .rowGrid 
    { 
     cursor: pointer; 
    } 
</style> 

<asp:GridView runat="server" ID="GridView1" AutoGenerateColumns="true" > 
      <RowStyle CssClass="rowGrid" /> 
      <Columns> 
       <asp:CommandField ButtonType="Button" ShowSelectButton="true" HeaderStyle-CssClass="hiddenColumn" 
        ItemStyle-CssClass="hiddenColumn" FooterStyle-CssClass="hiddenColumn" /> 
      </Columns> 
     </asp:GridView> 

<script type="text/javascript"> 
     $(function() { 
      $("#<%= GridView1.ClientID %> tr.rowGrid") 
      .live("click", function (event) { 
       $(this).find("input[type='button'][value='Select']").click(); 
      }); 

      $("#<%= GridView1.ClientID %> input[type='button'][value='Select']") 
       .live("click", function (event) { 
        event.stopPropagation(); 
       }); 

     }); 
    </script> 
0

यह एक पीछे

protected void Grid_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    GridViewRow row = gvSummary.SelectedRow; 
    //Int32 myvalue= Convert.ToInt32(row.Attributes["ColumnName"].ToString()); 
    } 

ग्रिड में OnSelectedIndexChanged ईवेंट जोड़ने

OnSelectedIndexChanged="Grid_SelectedIndexChanged" 

और उसके बाद कोड पर कोशिश करो और सेट EnableViewState = "false" लेकिन यहां आपको दो और चीजें करने की ज़रूरत है जिन्हें आपने पहले ही अपने कोड के अर्थ में किया है रों झूठे और ग्रिड Databinding पेज लोड पर करने के लिए सेट EnableEventValidation ..

11

इसके बजाय RowCreated पर यह कर के, आप इसे Render() पर कर सकता है। इस तरह आप के ओवरलोड को registerForEventValidation पर सच्चाई के साथ उपयोग कर सकते हैं और "अमान्य पोस्टबैक/कॉलबैक तर्क" त्रुटि से बच सकते हैं।

कुछ इस तरह:

protected override void Render(HtmlTextWriter writer) 
    { 
     foreach (GridViewRow r in GridView1.Rows) 
     { 
     if (r.RowType == DataControlRowType.DataRow) 
     { 
      r.Attributes["onmouseover"] = "this.style.cursor='pointer';this.style.textDecoration='underline';"; 
      r.Attributes["onmouseout"] = "this.style.textDecoration='none';"; 
      r.ToolTip = "Click to select row"; 
      r.Attributes["onclick"] = this.Page.ClientScript.GetPostBackClientHyperlink(this.GridView1, "Select$" + r.RowIndex,true); 

     } 
     } 

     base.Render(writer); 
    } 
+0

धन्यवाद आदमी, मुझे यही चाहिए :) – 123iamking