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