Asp.Net Forum Sistemi Yapma

Asp.net ile basit bir forum sistemi oluşturacağız kullanıcıların sorular sorup, cevap yazabilecekleri basit bir sistem yazacağız. Konu sonundan çalışan halini indirebilirsiniz…
İlk olarak soru ve cevapları kaydedebilmek için veritabanı ve tablolarımızı oluşturalım
forumsistemi1
sorular ve cevaplar olmak üzere yukarıdaki özelliklerde iki tablo oluşturuyoruz. Veritabanımızı App_Data klasörünün içine ekliyoruz.
App_Data klasörü nereden çıktı, veritabanı bunun içine nasıl ekleniyor diyorsanız proje isminin üzerinde sağ tıklayıp Add->Add Asp.Net Folder->App_Data yolunu izliyoruz daha sonra App_Data klsörüne sağ tıklayıp Add->Existing item seçeneği ile veri tabanı dosyamızı seçip projemize ekliyoruz.
Sitemizde üç sayfamız olacak bunlar forumanasayfa.aspx, sorugoster.aspx ve yenisoru.aspx; şimdi sırayla sayfalarımız yapalım ilk olarak soruları görüntülemek için gerekli olan forumanasayfa.aspx sayfası

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>www.aspnetornekleri.com Forum Sistemi</title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:HyperLink ID="hplyenisoru" runat="server" NavigateUrl="yenisoru.aspx">Yeni Soru</asp:HyperLink>
	<asp:GridView ID="grdsorular" runat="server" AutoGenerateColumns="False" 
        onpageindexchanging="grdsorular_PageIndexChanging" 
        onrowdatabound="grdsorular_RowDataBound">
				<Columns>
					<asp:TemplateField HeaderText="Soru No">
						<ItemTemplate>
						<div style="text-align:center">
							<asp:Label ID="lblsoruid" runat="server"></asp:Label>
						</div>
						</ItemTemplate>
					</asp:TemplateField>
					<asp:TemplateField HeaderText="Tarih">
						<ItemTemplate>
							<asp:Label ID="lbltarih" runat="server"></asp:Label>
						</ItemTemplate>
					</asp:TemplateField>
					<asp:TemplateField HeaderText="Soru">
						<ItemTemplate>
							<asp:HyperLink ID="hplsoru" runat="server"></asp:HyperLink>
						</ItemTemplate>
					</asp:TemplateField>
					<asp:TemplateField HeaderText="İsim">
						<ItemTemplate>
							<div style="text-align:center">
								<asp:Label ID="lblisim" runat="server"></asp:Label>
							</div>
						</ItemTemplate>
					</asp:TemplateField>
					<asp:TemplateField HeaderText="Görüntülenme Sayısı">
						<ItemTemplate>
							<div style="text-align:center">
								<asp:Label ID="lblgoruntulenme" runat="server"></asp:Label>
							 </div>
						</ItemTemplate>
					</asp:TemplateField>
					<asp:TemplateField HeaderText="Cevap Sayısı">
						<ItemTemplate>
							<div style="text-align:center">
								<asp:Label ID="lblcevap" runat="server"></asp:Label>
							 </div>
						</ItemTemplate>                
					</asp:TemplateField>
				</Columns>
			</asp:GridView>
    </form>
</body>
</html>

forumsistemi5

protected OleDbConnection baglanti;
        protected void Page_Load(object sender, EventArgs e)
        {
            string veritabani = null;
            veritabani = "Provider=Microsoft.ACE.OLEDB.12.0; DATA Source=" + Server.MapPath("App_Data/forum.accdb");
            baglanti = new OleDbConnection(veritabani);
            baglanti.Open();

            if (!Page.IsPostBack)
            {
                forumgoster();
            }
        }
        protected void forumgoster()
        {
            OleDbDataAdapter dtAdapter = new OleDbDataAdapter();
            OleDbCommand komut = new OleDbCommand();
            DataSet ds = new DataSet();

            StringBuilder sorgu = new StringBuilder();
            sorgu.Append(" SELECT * FROM sorular ");
            sorgu.Append(" ORDER BY soruid DESC ");

            var verigetir = komut;
            verigetir.Connection = baglanti;
            verigetir.CommandText = sorgu.ToString();
            verigetir.CommandType = CommandType.Text;
            dtAdapter.SelectCommand = komut;

            dtAdapter.Fill(ds);

            grdsorular.AllowPaging = true;
            grdsorular.PageSize = 5;
            grdsorular.DataSource = ds.Tables[0];
            grdsorular.DataBind();

        }
        protected void grdsorular_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            grdsorular.PageIndex = e.NewPageIndex;
            forumgoster();
        }

        protected void grdsorular_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                //*** Soru Numarası ***'
                Label lblsoruid = (Label)e.Row.FindControl("lblsoruid");
                if ((lblsoruid != null))
                {
                    lblsoruid.Text = DataBinder.Eval(e.Row.DataItem, "soruid").ToString();
                }

                //*** Tarih Bilgisi ***'
                Label lbltarih = (Label)e.Row.FindControl("lbltarih");
                if ((lbltarih != null))
                {
                    lbltarih.Text = Convert.ToDateTime(DataBinder.Eval(e.Row.DataItem, "sorutarih")).ToString("dd/MM/yyyy HH:mm");
                }

                //*** soru ***'
                HyperLink hplsoru = (HyperLink)e.Row.FindControl("hplsoru");
                if ((hplsoru != null))
                {
                    hplsoru.Text = (string)DataBinder.Eval(e.Row.DataItem, "soru");
                    hplsoru.NavigateUrl = "sorugoster.aspx?soruid=" + DataBinder.Eval(e.Row.DataItem, "soruid").ToString();
                }

                //*** İsim ***'
                Label lblisim = (Label)e.Row.FindControl("lblisim");
                if ((lblisim != null))
                {
                    lblisim.Text = (string)DataBinder.Eval(e.Row.DataItem, "isim");
                }

                //*** Görüntülenme Sayısı ***'
                Label lblgoruntulenme = (Label)e.Row.FindControl("lblgoruntulenme");
                if ((lblgoruntulenme != null))
                {
                    lblgoruntulenme.Text = DataBinder.Eval(e.Row.DataItem, "goruntulenme").ToString(); ;
                }

                //*** Cevap Sayısı ***'
                Label lblcevap = (Label)e.Row.FindControl("lblcevap");
                if ((lblcevap != null))
                {
                    lblcevap.Text = DataBinder.Eval(e.Row.DataItem, "cevap").ToString(); ;
                }

            }

        }

        protected void Page_UnLoad(object sender, EventArgs e)
        {
            baglanti.Close();
            baglanti = null;
        }

forumsistemi3
Şimdi yenisoru.aspx sayfasını yapıyoruz..

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>www.aspnetornekleri.com Forum Sistemi</title>
    <style type="text/css">

        .style2
        {
            height: 97px;
        }
        .style3
        {
            height: 24px;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
 <table width="600" border="1" cellpadding="0" cellspacing="0" bordercolor="#CCCCCC">
  <tr>
    <td class="style3">
        <asp:Label ID="lblsoru" runat="server" Text="Sorunuz :"></asp:Label>
      </td>
    <td class="style3">
            <asp:TextBox ID="txtsoru" runat="server" Width="387px"></asp:TextBox>
      </td>
  </tr>
  <tr>
    <td class="style2">
        <asp:Label ID="lblaciklama" runat="server" Text="Sorunuzun ile ilgili kısa bir açıklama :"></asp:Label>
      </td>
    <td class="style2">
        <asp:TextBox ID="txtaciklama" runat="server" Columns="5" Height="83px" 
            TextMode="MultiLine" Width="301px"></asp:TextBox>
      </td>
  </tr>
  <tr>
    <td width="109">
        <asp:Label ID="lblisim" runat="server" Text="İsminiz :"></asp:Label>
      </td>
    <td width="579">
            <asp:TextBox ID="txtisim" runat="server"></asp:TextBox>
    </td>
  </tr>
  <tr>
    <td width="109" colspan="2" style="width: 688px">
        <asp:Button ID="btnkaydet" runat="server" Text="Kaydet" onclick="btnkaydet_Click" />
      </td>
  </tr>
</table>

    </div>
    </form>
</body>
</html>

forumsistemi6

 protected void btnkaydet_Click(object sender, EventArgs e)
        {
            OleDbConnection baglanti = null;
            StringBuilder sorgu = new StringBuilder();
            OleDbCommand komut = null;

            string veritabani = null;
            veritabani = "Provider=Microsoft.ACE.OLEDB.12.0; DATA Source=" + Server.MapPath("App_Data/forum.accdb");
            baglanti = new OleDbConnection(veritabani);
            baglanti.Open();

            //*** Insert soru www.aspnetornekleri.com ***'
            sorgu.Append(" INSERT INTO sorular (sorutarih,soru,detay,isim,[goruntulenme],cevap) ");
            sorgu.Append(" VALUES ");
            sorgu.Append(" (@sorutarih,@soru,@detay,@isim,@goruntulenme,@cevap) ");
            komut = new OleDbCommand(sorgu.ToString(), baglanti);
            komut.Parameters.Add("@sorutarih", OleDbType.Date).Value = DateTime.Now.ToString();
            komut.Parameters.Add("@soru", OleDbType.VarChar).Value = this.txtsoru.Text;
            komut.Parameters.Add("@detay", OleDbType.VarChar).Value = this.txtaciklama.Text;
            komut.Parameters.Add("@isim", OleDbType.VarChar).Value = this.txtisim.Text;
            komut.Parameters.Add("@goruntulenme", OleDbType.Integer).Value = 0;
            komut.Parameters.Add("@cevap", OleDbType.Integer).Value = 0;
            komut.ExecuteNonQuery();
            baglanti.Close();
            baglanti = null;
            Response.Redirect("forumanasayfa.aspx");
        }

forumsistemi2
Son olarak da sorugoster.aspx sayfasını yapıyoruz…

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>www.aspnetornekleri.com Forum Sistemi</title>
    <style type="text/css">
        .style1
        {
            height: 33px;
        }
        .style2
        {
            height: 97px;
        }
        .style3
        {
            width: 318px;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <table width="693" border="1" cellpadding="0" cellspacing="0" bordercolor="#CCCCCC">
  <tr>
    <td colspan="2" class="style1">
        <div style="text-align:center">
            <asp:Label ID="lblsoru" runat="server" Font-Size="X-Large"></asp:Label>
        </div>
    </td>
  </tr>
  <tr>
    <td colspan="2" class="style2">
            <asp:Label ID="lblaciklama" runat="server"></asp:Label>
    </td>
  </tr>
  <tr>
    <td width="344">
            <asp:Label ID="lblisim" runat="server"></asp:Label>
        &nbsp;<asp:Label ID="lbltarih" runat="server"></asp:Label>
    </td>
    <td width="343" class="style3">
            <asp:Label ID="lblgoruntulenme" runat="server"></asp:Label>
        &nbsp;<asp:Label ID="lblcevap" runat="server"></asp:Label>
    </td>
  </tr>
</table>
        <br />
        
    <asp:Repeater id="cevapgoruntuleyici" runat="server" 
            onitemdatabound="cevapgoruntuleyici_ItemDataBound">
	<ItemTemplate>
         <table width="693" border="1" cellpadding="0" cellspacing="0" bordercolor="#CCCCCC">
          <tr>
            <td colspan="2" class="style2">
            <asp:Label ID="lblcevapno" runat="server"></asp:Label><br /><br />
            <asp:Label ID="lblcevapdetay" runat="server"></asp:Label></td>
          </tr>
          <tr>
            <td width="344">
                    <asp:Label ID="lblcevaplayan" runat="server"></asp:Label>
            </td>
            <td width="343" class="style3">
                    <asp:Label ID="lblcevaptarih" runat="server"></asp:Label>
            </td>
          </tr>
        </table>	
        <br />	
	</ItemTemplate>
	</asp:Repeater>        
        
        <asp:HyperLink ID="hplgeri" runat="server" NavigateUrl="forumanasayfa.aspx">Forum'a Geri Dön</asp:HyperLink>
        
<br /><br />
 <table width="600" border="1" cellpadding="0" cellspacing="0" bordercolor="#CCCCCC">
  <tr>
    <td class="style2">
        <asp:Label ID="lblcevapdetaybaslik" runat="server" Text="Cevabınız...:"></asp:Label>
      </td>
    <td class="style2">
        <asp:TextBox ID="txtdetay" runat="server" Columns="5" Height="83px" 
            TextMode="MultiLine" Width="301px"></asp:TextBox>
      </td>
  </tr>
  <tr>
    <td width="109">
        <asp:Label ID="lblcevaplayanadibaslik" runat="server" Text="İsminiz :"></asp:Label>
      </td>
    <td width="579">
            <asp:TextBox ID="txtisim" runat="server"></asp:TextBox>
    </td>
  </tr>
  <tr>
    <td width="109" colspan="2" style="width: 688px">
        <asp:Button ID="btnkaydet" runat="server" Text="Kaydet" style="height: 26px" onclick="btnkaydet_Click" 
           />
      </td>
  </tr>
</table>

    </div>
    </form>
</body>
</html>

forumsistemi4
Kodlarımız..

protected OleDbConnection baglanti;
        protected string sorgusoruid = HttpContext.Current.Request.QueryString["soruid"];
        protected int cevapno = 1;
        protected void Page_Load(object sender, EventArgs e)
        {
            string veritabani = null;
            veritabani = "Provider=Microsoft.ACE.OLEDB.12.0; DATA Source=" + Server.MapPath("App_Data/forum.accdb");
            baglanti = new OleDbConnection(veritabani);
            baglanti.Open();

            sorularigoster();
            cevaplarigoster();
        }
        protected void sorularigoster()
        {
            OleDbDataAdapter dtAdapter = null;
            OleDbCommand komut = null;
            DataTable dt = new DataTable();
            StringBuilder sorgu = new StringBuilder();
            sorgu.Append("SELECT * FROM sorular ");
            sorgu.Append(" WHERE soruid=" + sorgusoruid + " ");
            dtAdapter = new OleDbDataAdapter(sorgu.ToString(), baglanti);
            dtAdapter.Fill(dt);

            if (dt.Rows.Count > 0)
            {
                this.lblsoru.Text = dt.Rows[0]["soru"].ToString();
                this.lblaciklama.Text = dt.Rows[0]["detay"].ToString();
                this.lblisim.Text = "<b>İsim : </b>" + dt.Rows[0]["isim"].ToString();
                this.lbltarih.Text = "<b>Soru Tarihi : </b>" + Convert.ToDateTime(dt.Rows[0]["sorutarih"]).ToString("dd/MM/yyyy HH:mm").ToString();
                this.lblcevap.Text = "<b>Cevap Sayısı : </b>" + dt.Rows[0]["cevap"].ToString();
                this.lblgoruntulenme.Text = "<b>Görüntülenme Sayısı : </b>" + dt.Rows[0]["goruntulenme"].ToString();
            }

            //*** Görüntülenme sayısını güncelliyoruz....  www.aspnetornekleri.com***'
            sorgu.Remove(0, sorgu.Length);
            sorgu.Append(" UPDATE sorular SET [goruntulenme] = [goruntulenme] + 1 ");
            sorgu.Append(" WHERE soruid = @soruid ");
            komut = new OleDbCommand(sorgu.ToString(), baglanti);
            komut.Parameters.Add("@soruid", OleDbType.VarChar).Value =sorgusoruid.ToString();
            komut.ExecuteNonQuery();

        }


        protected void cevaplarigoster()
        {
            StringBuilder sorgu = new StringBuilder();
            OleDbCommand komut = null;

            sorgu.Append(" SELECT * FROM cevaplar ");
            sorgu.Append(" WHERE soruid = " + sorgusoruid + " ");

            OleDbDataReader dtReader = null;
            komut = new OleDbCommand(sorgu.ToString(), baglanti);
            dtReader = komut.ExecuteReader();

            //*** cevapgoruntuleyici isimli repetarımıza ceveplar geliyor.... ***'
            cevapgoruntuleyici.DataSource = dtReader;
            cevapgoruntuleyici.DataBind();

            dtReader.Close();
            dtReader = null;

        }

        protected void Page_UnLoad(object sender, EventArgs e)
        {
            baglanti.Close();
            baglanti = null;
        }

        protected void btnkaydet_Click(object sender, EventArgs e)
        {
            StringBuilder sorgu = new StringBuilder();
            OleDbCommand komut = null;

            //*** Cevap Ekleme www.aspnetornekleri.com***'
            sorgu.Append(" INSERT INTO cevaplar (soruid,tarih,detay,isim) ");
            sorgu.Append(" VALUES ");
            sorgu.Append(" (@soruid,@tarih,@detay,@isim) ");
            komut = new OleDbCommand(sorgu.ToString(), baglanti);
            komut.Parameters.Add("@sQuestionID", OleDbType.VarChar).Value = sorgusoruid.ToString();
            komut.Parameters.Add("@sCreateDate", OleDbType.Date).Value = DateTime.Now.ToString();
            komut.Parameters.Add("@sDetails", OleDbType.VarChar).Value = this.txtdetay.Text;
            komut.Parameters.Add("@sName", OleDbType.VarChar).Value = this.txtisim.Text;
            komut.ExecuteNonQuery();

            //*** Cevap Sayısını Bir Artttır ***'
            sorgu.Remove(0, sorgu.Length);
            sorgu.Append(" UPDATE sorular SET cevap = cevap + 1 ");
            sorgu.Append(" WHERE soruid = @soruid ");
            komut = new OleDbCommand(sorgu.ToString(), baglanti);
            komut.Parameters.Add("@soruid", OleDbType.VarChar).Value = sorgusoruid.ToString();
            komut.ExecuteNonQuery();

            Response.Redirect("sorugoster.aspx?soruid=" + sorgusoruid);
        }
        protected void cevapgoruntuleyici_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item | e.Item.ItemType == ListItemType.AlternatingItem)
            {
                //*** Numara ***'
                Label lblcevapno = (Label)e.Item.FindControl("lblcevapno");
                if ((lblcevapno != null))
                {
                    lblcevapno.Text = "Cevap Numarası : " + cevapno;
                    cevapno = cevapno + 1;
                }

                //*** Cevapın Detayı ***'
                Label lblcevapdetay = (Label)e.Item.FindControl("lblcevapdetay");
                if ((lblcevapdetay != null))
                {
                    lblcevapdetay.Text = (string)DataBinder.Eval(e.Item.DataItem, "detay");
                }

                //*** Cevaplayan  www.aspnetornekleri.com***'
                Label lblcevaplayan = (Label)e.Item.FindControl("lblcevaplayan");
                if ((lblcevaplayan != null))
                {
                    lblcevaplayan.Text = (string)DataBinder.Eval(e.Item.DataItem, "isim");
                }

                //*** Cevap Tarihi www.aspnetornekleri.com ***'
                Label lblcevaptarih = (Label)e.Item.FindControl("lblcevaptarih");
                if ((lblcevaptarih != null))
                {
                    lblcevaptarih.Text = Convert.ToDateTime(DataBinder.Eval(e.Item.DataItem, "tarih")).ToString("dd/MM/yyyy HH:mm");
                }

            }
        }

Projenin çalışan hali..:Asp.Net Forum Sistemi İndir

  • ali kemal sevind

    sql veritabanı için nasıl uyarlanabilir ?

  • murat

    Yazılan methodlar veya satırlara açıklama yazılması gerek bence.Dümdüz yazılıp geçilmiş.

  • yeşim

    meraba kolay gelsin ben bu projeyi masterpageye uyguluyorum ama
    <asp:GridView ID="grdsorular" runat="server" AutoGenerateColumns="False"
    burada hata alıyorum nasıl düzeltebilirim

    • BilisimOgretmeni

      konu sonunda uygulamanın çalışan hali var indirip deneyebilirsiniz…

  • Serkan

    ya hocam az daha açıklama yapsan resimler arası ne olacak,senin kadar bilsek burda işimiz olmazdı zaten.mesela 1. ve 2. resim arasındaki bağlantı nasıl 2.resimdeki kodlar nereye yazılacak arada hiç açıklama yok şu protected kısmı ile başlayan yer orası nereye yazılacak nasıl yazılacak hiç bişey dememişsinyeni asp açsak olmuyor ilk kodun bittiği yer devam ettirsek yine olmuyor ne yapıcaz orayı

    • BilisimOgretmeni

      elimden geldiği kadar açıklama yapmaya çalıştım, konu sonunda uygulamanın çalışan halini indirip test edebilirsiniz. Eğer bu işlem zor geldiyse diğer uygulamalar üzerinde çalışın

  • Emre

    iyi günler ben bu kodlamayı kendi masterpage uygulamama nasıl gömebilirim ?

    • BilisimOgretmeni

      merhaba, forum sistemin de gösterilecek olan alanları contentplaceholder içine alarak yapabilirsiniz., tasarımınızı bilmediğim için konular için sorular için ayrı ayrı ContentPlaceHolder ekleyerek gerçekleştirebilirsiniz diyebilirim en fazla…

  • Nazım Mert

    Teşekkürler.

    • BilisimOgretmeni

      biz teşekkür ederiz iyi çalışmalar

  • programmer

    emeğinize sağlık ama cevab kısmında cevabı yazınca kaydetmıyor

    • BilisimOgretmeni

      uyarınız için teşekkürler kodlar doğru ama zipli dosyada kaydet butonuna click olayı atamamışım

      tasarım alanında

      <asp:Button ID=”btnkaydet” runat=”server” Text=”Kaydet” style=”height: 26px” onclick=”btnkaydet_Click” /> düzenlemesi ile sorunu çözebilirsiniz

      yada zipli dosyayı düzenledim tekrar indirebilrsiniz..