En iyi yanıtlayıcılar
bir tıklamayla css classı değiştirmek istiyorum fakat tıkladığımda "Object reference not set to an instance of an object." hatası alıyorum....

Soru
-
bir tıklamayla css classı değiştirmek istiyorum fakat tıkladığımda "Object reference not set to an instance of an object." hatası alıyorum....nerede yanlış yapıyorum? teşekkürler...
<asp:Repeater ID="rptInbox" runat="server" OnItemCommand="rptInbox_ItemCommand"> <HeaderTemplate> <table style="width: 100%"> <tr> <th align="center"> ID </th> <th align="center"> Gelen Mesaj </th> <th align="center"> Geliş Tarihi </th> <th align="center"> Oku </th> <th align="center"> Sil </th> </tr> </HeaderTemplate> <ItemTemplate> <tr> <td align="center"> <%# Eval("ID") %> </td> <td align="center"> <%# Eval("Message") %> </td> <td align="center"> <%# Eval("InDate") %> </td> <td align="center"> <asp:LinkButton ID="libRead" runat="server" CssClass="notread" CommandName="Readd" CommandArgument='<%# Eval("ID") %>'> </asp:LinkButton> </td> <td align="center"> <asp:LinkButton ID="libDel" runat="server" CssClass="del" OnClientClick="return ConfirmOnDelete()" CommandName="Delete" CommandArgument='<%# Eval("ID") %>'> </asp:LinkButton> </td> </tr> </ItemTemplate> <FooterTemplate> </table> </FooterTemplate> </asp:Repeater>
protected void rptInbox_ItemCommand(object source, RepeaterCommandEventArgs e) { if (e.CommandName == "Readd") { ((LinkButton)rptInbox.FindControl("libRead")).CssClass = "read"; conn = new SqlConnection(conStr); string query = "select Message, InDate from Inbox where ID=" + e.CommandArgument; cmd = new SqlCommand(query, conn); cmd.Parameters.Add("@ID", SqlDbType.Int); cmd.Parameters["@ID"].Value = e.CommandArgument; try { conn.Open(); reader = cmd.ExecuteReader(); if (reader.Read()) { lblDate.Text = reader["InDate"].ToString(); litOku.Text = reader["Message"].ToString(); } reader.Close(); } catch (Exception ex) { lblW.ForeColor = Color.Red; lblW.Text = "Bir hata oluştu!<br/>" + ex.Message; } finally { conn.Close(); } } }
- Düzenleyen Melih K 7 Temmuz 2013 Pazar 07:34
Yanıtlar
Tüm Yanıtlar
-
Repeater da Items adında bir özellik bulunuyor. Bu collection da Items[0] HeaderTemplate, Items[1] ItemTemplate, Items[2] ise FooterTemplate e karşılık geliyor. Bu yüzden aramanızı şu şekilde yapmalısınız:
((LinkButton)rptInbox.Items[1].FindControl("libRead")).CssClass = "read";
- Yanıt Olarak Öneren Ali Rıza İnceoğlu 8 Temmuz 2013 Pazartesi 07:53
-
-
Önceki mesajımda da dediğim gibi Items özelliği Header ve Footer Template i de temsil edebiliyor. Verdiğim örnekte repeater da sadece 3 item (Header, 1 Item, Footer) olduğunu varsaydım. Ama siz repeater içerisinde 1 taneden fazla veri bulundurduğunuz için sizde durum şöyle:
Items[0] = HeaderTemplate
Items[1 .. Verisayısı] = Elemanlar
Items [Verisayısı+1] = FooterYani Items[1] sizin veri kaynağından aldığınız verilerin 1. sine tekabul ediyor. Bir döngü kurup Items içerisinde dolaşabilirsiniz (Items[i] gibi)...
Ya da direkt Items içerisinde arama yapabilirsiniz.- Düzenleyen Aydın AKAN 8 Temmuz 2013 Pazartesi 14:28 Ek bilgi
-
teşekkürler...şu şekilde bir döngü kurdum:
void itemz()
{
for (int i = 0; i < rptInbox.Items.Count; i++)
{
((LinkButton)rptInbox.Items[i].FindControl("libRead")).CssClass = "read";
}
}
fakat bu seferde hangisini tıklarsam tıklayayım hepsini okundu işaretliyor...yani class ını değiştiriyor...
-
Sizin sadece o satırdaki elemanı almanız gerekiyor. Bunun için hangi satırda olduğunuzu bilmelisiniz, yani index numarasını bilmelisiniz. Döngü kurmayacak, sadece o index numarasına sahip olan satırdaki elemanı alacaksınız. Bunun için CommandArgument özelliğini kullanabilirsiniz. Ya da daha farklı teknikler kullanabilirsiniz.
-
bir örnek verirmisiniz?
-
-
ya işte budur ya 3 gündür bunu arıyorum :))...sonsuz teşekkürler... ;)