none
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.... RRS feed

  • 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") %>'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</asp:LinkButton>
    				</td>
    				<td align="center">
    					<asp:LinkButton ID="libDel" runat="server" CssClass="del" OnClientClick="return ConfirmOnDelete()" CommandName="Delete" CommandArgument='<%# Eval("ID") %>'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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
    7 Temmuz 2013 Pazar 07:33

Yanıtlar

  • Siz ItemCommand kullandığınız için daha kolayı var. e.Item kullanarak ilgili Item ı alıp içerisinde LinkLabel ı bulabilirsiniz. Şöyle:

    ((LinkButton)e.Item.FindControl("libRead")).CssClass = "read";

    • Yanıt Olarak İşaretleyen Melih K 9 Temmuz 2013 Salı 21:25
    9 Temmuz 2013 Salı 15:31

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";

    7 Temmuz 2013 Pazar 12:52
  • yanıt için teşekkürler... evet yaptım çalışıyor anak şu şekilde çalışıyor repeater da diyelim 3 satır var ben hangi satırdaki mesajı seçersem seçeyim 2. satırdaki class ı değiştiriyor sadece...bu neden kaynaklanıyor olabilir???teşekkürler....
    8 Temmuz 2013 Pazartesi 07:50
  • Ö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] = Footer

    Yani 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
    8 Temmuz 2013 Pazartesi 14:23
  • 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...


    mkayar86[at]gmail[nokta]com www.facebook.com/mkayar86

    8 Temmuz 2013 Pazartesi 19:02
  • 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.
    8 Temmuz 2013 Pazartesi 22:05
  • Siz ItemCommand kullandığınız için daha kolayı var. e.Item kullanarak ilgili Item ı alıp içerisinde LinkLabel ı bulabilirsiniz. Şöyle:

    ((LinkButton)e.Item.FindControl("libRead")).CssClass = "read";

    • Yanıt Olarak İşaretleyen Melih K 9 Temmuz 2013 Salı 21:25
    9 Temmuz 2013 Salı 15:31
  • ya işte budur ya 3 gündür bunu arıyorum :))...sonsuz teşekkürler... ;)


    mkayar86[at]gmail[nokta]com www.facebook.com/mkayar86

    9 Temmuz 2013 Salı 20:39