2011-06-06 18 views
30

Kullanıcı, GridView'da satırdaki herhangi bir noktaya bastığında, Seç düğmesi yerine satırın seçileceği bir özelliği uygularım.Seçme düğmesi olmadan GridView'da tam satır seçimi nasıl yapılır?

enter image description here

o uygulamak için, aşağıdaki kodu kullanıyorum: Yukarıdaki kod ile

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, ""); 
    } 
} 

aşağıdaki sorunlar var:

  • Bu yalnızca çalışıyor Bu sayfa için EnableEventValidationfalse olarak ayarlanmıştır.
  • SelectedIndexChanged yalnızca Grid.DataBind() sayfasının (her geri bildirimde) Page_Load için çağrılması durumunda tetiklenir.

Yanlış bir şey yapıyorum? Daha iyi bir uygulama var mı?


Düzenleme: EnableEventValidationtrue olarak ayarlandığında , aşağıdaki hata görüntülenir:

Geçersiz geri gönderme veya geri arama bağımsız değişken. Olay doğrulama, yapılandırmada veya bir sayfada <% @ EnableEventValidation = "true"%> kullanılarak etkinleştirildi. Güvenlik nedeniyle, bu özellik, geri gönderme veya geri arama olayları için argümanların, orijinal olarak oluşturulmuş sunucu denetiminden kaynaklandığını doğrular. Veriler geçerli ve bekleniyorsa, geri bildirim veya geri çağırma verilerini doğrulama için kaydetmek için ClientScriptManager.RegisterForEventValidation yöntemini kullanın.

cevap

46

Bunu her bir geri yüklemeye eklemelisiniz, sadece veri bağlamada değil. Bu nedenle, GridView öğesinin RowCreated -Event özelliğini kullanmalısınız. Örneğin

(C#):

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); 
    } 
} 

(VB.) Net: EnableViewState = "false"

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

bu, 'EnableEventValidation' ayarının yanlış olarak ayarlanması sorununu çözmez. –

+0

@ Tim: Soruyu düzenledim, lütfen kontrol et. – Homam

+0

@Homam: Kodumu kullandınız mı ve hala "geçersiz geri gönderme/geri arama argümanı" mı alıyorsunuz? Bu hatayı projemde yeniden üretemiyorum ama bunun için başka bir neden olabilir. Bunu daha fazla araştırmak için zamanım yok. Bunu önlemek için [ClientScriptManager.RegisterForEventValidation] (http://msdn.microsoft.com/en-us/library/ms223397.aspx) adresini kullanabilirsiniz. Belki [bu bağlantı] (http://www.codeproject.com/KB/webforms/DoubleClickGridviewRow.aspx) yardımcı olur. –

-2

, sizin <tr> ASPX kodu etrafındaki <asp:LinkButton> kullanmayı deneyin LinkButton'a en CommandName='Select' Ve öğe komut durumunda, süreci bu komutu ayarlayın ve seçilen bir satırın stili ayarlamak!

+1

Emin td arasında bir linikbutton yaşıyorsanız ve tr geçerli tamamen uyumlu HTML üretir? –

+0

@Davide Piras: Standartlara uygun HTML, bir gereklilik olarak bu sorudan bahsetmedi! Bu bir gereklilikse, o zaman çözümü kabul etmeyin! Bazı olasılıklar gösterdim! – Nauman

+0

Ben katılmıyorum, ben aşağı oy vermedi ve değil ama orijinal yazıya belirtilmiş olsa bile, yaz 2011 yılında (hemen), hadi çapraz tarayıcı ve tam uyumlu cevaplar verelim :) ;-) –

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

bu bir

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

arkasında kod üzerinde ızgara sonra

OnSelectedIndexChanged="Grid_SelectedIndexChanged" 

ve OnSelectedIndexChanged olay eklemek deneyin ve set ama Burada daha önce kodunuzda yapmış olduğunuz iki şeyi daha yapmak zorundasınız s sayfa Yük üzerinde yanlış ve Izgara Veri bağlama için ayarlanan EnableEventValidation ..

11

yerine RowCreated üzerine yaptığını, sen Render() bunu yapabilirdi. Bu şekilde GetPostBackClientHyperlink aşırı yükünü registerForEventValidation üzerinde doğru olarak kullanabilir ve "geçersiz geri gönderme/geri arama argümanı" hatasını önleyebilirsiniz. Böyle

şey:

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

Teşekkürler, bu ihtiyacım olan şey :) – 123iamking

İlgili konular