, arkadaşlar bu makalem de basit bir forum uygulamasi yapacagiz. Ilk olarak sunu belirtmeliyim Access(Forum access dosyasi..) veritabanına kayit yapicagiz ve Asp.Net in DataGrid Fonksiyonu ile verileri okuyup kullanicilara yansitacagiz. Forum yönetici tarafindan kontrol edilebiliyor olacaktir.
Bu makale ve uygulamayi yazmamdaki amacim en basitinden asp.net ile forumun nasıl yapildigi ve forumlarin nasıl çalistigini göstermektir.
Kodlarla ilgili gerekli açiklamalar yanlarina yazilmistir. Projemize Ana sayfadan basliyoruz. Default.aspx in source kismina asagidaki kodlari yaziyoruz.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Basit Forum Uygulamasi</title>
<script type="text/javascript" language="javascript"> // Kullanici Isimini yazip yazmadigini kontrol edip uyari Mesaji Veriyoruz.
function Validate(theForm)
{
if (theForm.FrmKullaniciAdi.value == "")
{
alert("Lütfen isminizi yazin");
theForm.FrmKullaniciAdi.focus();
return (false);
}
return (true)
}
</script>
</head>
<body onload="Javascript: document.form1.FrmKullaniciAdi.focus()">
<form id="form1" method="post" runat="server" onSubmit="return Validate(this)">
<table border="0" align="center" cellspacing="1" cellpadding="5">
<tr>
<td width="100%" style="height: 94px">
<b>Foruma giriş Için Isminizi Yazin:</b>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td valign="top">
Isminiz :
<asp:TextBox id="FrmKullaniciAdi" runat="server" Columns="15"></asp:TextBox>
</td>
<td valign="top" rowspan="2">
<asp:Button id="Button1" runat="server" OnClick="DoLogin" Text="Tamam"></asp:Button>
</td>
</tr>
<tr>
<td valign="top" align="right">
<asp:TextBox id="FrmSifre" Visible="False" runat="server" Columns="15" TextMode="Password"></asp:TextBox>
</td>
</tr>
</table>
</td>
</tr>
</table>
</form>
</body>
</html>
Daha sonra Default.aspx.cs ye asagidaki kodlari yaziyoruz.
using System;
using System.Data;
using System.Data.OleDb;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class _Default : System.Web.UI.Page
{
public void DoLogin(object sender, System.EventArgs e)
{
if (FrmKullaniciAdi.Text == "admin") // Eger kullanici isminiz bölümüne admin yazarsa hemen alt kisminda sifre girilmesi için bölüm çikacaktir
{
if (FrmSifre.Text == "Sifre") // Altta çikacak bölüme Sifre yazilirsa
{
Session["KullaniciAdi"] = FrmKullaniciAdi.Text;
Session["admin"] = "yes";
Response.Redirect("Konular.aspx");// Kullaniciya Silme yetkisi verilerek konular bölümüne yönlendirir.
}
else
{
FrmSifre.Visible = true; // Eger Kullanici parolayi dogru girmezse izin vermez.
}
}
else // Yukardaki kosullar olusmazsa yazilan adi hafizaya alarak Konular a yönlendirir.
{
Session["KullaniciAdi"] = FrmKullaniciAdi.Text;
Response.Redirect("Konular.aspx");
}
}
}
Simdi ise kullanıcının foruma konu eklemesi için KonuEkle.aspx i yaratalim
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="KonuEkle.aspx.cs" Inherits="KonuEkle" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Konu Ekle</title>
<script type="text/javascript" Language="JavaScript">
function Validate(theForm)
{
if (theForm.frmPost.value == "")
{
alert("Lütfen Yeni Konu Ismini Girin");
theForm.frmPost.focus();
return (false);
}
return (true)
}
</script>
</head>
<body>
<form id="AddTopic" method="post" runat="server" onSubmit="return Validate(this)">
<h2>
BasitForum
</h2>
<p>
Ilkbasta Girilen Kullanici Adi Ile Foruma Yeni Konu Ekliyebiliyoruz
</p>
<div id="outError" runat="server">
<table cellpadding="5" cellspacing="1" border="0" class="DataTable">
<tr>
<td class="TableItem">
Konu Yaratan :
<asp:Label ID="FrmAdi" Runat="server"></asp:Label>
<br />
Yeni Konu Adi : (Maksimum 255 Karakter )
<br />
<asp:TextBox id="frmPost" runat="server" TextMode="MultiLine" MaxLength="255" Columns="40" Rows="5"></asp:TextBox>
<table border="0" width="100%" cellspacing="0" cellpadding="0">
<tr>
<td width="100%" align="right">
<asp:Button onClick="DoAddTopic" Text="Ekle" Runat="server" id="Button1"></asp:Button>
</td>
</tr>
</table>
</td>
</tr>
</table>
<br />
<a href="Konular.aspx">Konulara Geri Dön</a>
</div>
</form>
</body>
</html>
Daha sonra KonuEkle.aspx.cs ye asagidaki kodlari yaziyoruz.
using System;
using System.Data;
using System.Data.OleDb;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class KonuEkle : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
// Kullanici Adini Kontrol Ediyoruz.
if (Session["KullaniciAdi"].ToString().Length < 1)
{
Response.Redirect("default.aspx");
}
FrmAdi.Text = "<b>" + Session["KullaniciAdi"].ToString() + "</b>";
}
public void DoAddTopic(object sender, System.EventArgs e)
{
string strConnect = "Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=" + Server.MapPath(".dbforum.mdb"); // veritabanı Baglanti Cümlesi
string strInsert = "INSERT INTO Konular (KonuBasligi, KonuSahibi) VALUES ('" + frmPost.Text + "', '" + Session["KullaniciAdi"].ToString() + "')"; // Kullanici tarafindan yazilan Konu adini ve kullanicin adini veritabanımizdaki Konular tablosundaki KonuBasligi ve KonuSahibi bölümlerine ekliyoruz.
try
{
//Yeni baglanti yaratiyoruz
OleDbConnection objConnect = new OleDbConnection(strConnect);
// veritabanı ile baglantiyi açiyoruz.
objConnect.Open();
OleDbCommand objCommand = new OleDbCommand(strInsert, objConnect);
objCommand.ExecuteNonQuery();
// veritabanı ile baglantiyi kapatiyoruz.
objConnect.Close();
// Konular.aspx' e Yönlendiriliyor
Response.Redirect("Konular.aspx", true);
}
catch (Exception objError)
{
//Hata varsa mesaj yazdiriyoruz.
outError.InnerHtml = "<b>* veritabanına baglanti hatasi</b>.<br />" + objError.Message + "<br />" + objError.Source;
return;
}
}
}
Simdi ise forumun konularinin listelenmesi için Konular. aspx i kodluyoruz.
Konular. aspx in source kismina asagidaki kodlari yaziyoruz.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Konular.aspx.cs" Inherits="Konular" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Konular</title>
</head>
<body>
<form id="Form1" method="post" runat="server">
<h3>
Basit Forum
</h3>
<div id="welcome" runat="server" />
<a href="KonuEkle.aspx">Yeni Konu Ekle</a>
<p />
<div id="outError" runat="server">
<asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="False" HeaderStyle-CssClass="TableHeader" AlternatingItemStyle-CssClass="AltTableItem" ItemStyle-CssClass="TableItem" CellPadding="4" ForeColor="#333333" GridLines="None">
<Columns>
<asp:TemplateColumn HeaderText="Yazar">
<ItemTemplate>
<asp:Label Runat='server' ID="lblAdminLink">
<%# DataBinder.Eval(Container.DataItem, "KonuSahibi") %>
<% if (Session["admin"] == "yes")
{ %>
<br>
<a href="KayitSilme.aspx?T=T&ID=<%# DataBinder.Eval(Container.DataItem, "KonuID") %>">
Sil</a>
<% }
%>
<br>
</asp:Label>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="Konu">
<ItemTemplate>
<asp:Label Runat='server' ID="lblSubject">
<a href="Mesajlar.aspx?ID=<%# DataBinder.Eval(Container.DataItem, "KonuID") %>&S=<%# DataBinder.Eval(Container.DataItem, "KonuBasligi") %>">
<%# DataBinder.Eval(Container.DataItem, "KonuBasligi") %>
</a>
</asp:Label>
</ItemTemplate>
</asp:TemplateColumn>
<asp:BoundColumn DataField="KonuTarihi" HeaderText="Yazildigi Tarih"></asp:BoundColumn>
</Columns>
<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<EditItemStyle BackColor="#2461BF" />
<SelectedItemStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
<AlternatingItemStyle BackColor="White" />
<ItemStyle BackColor="#EFF3FB" />
<HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
</asp:DataGrid> </div>
</form>
</body></html>
Daha sonra Konular.aspx.cs ye asagidaki kodlari yaziyoruz.
using System;
using System.Data;
using System.Data.OleDb;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class Konular : System.Web.UI.Page
{
public void Page_Load(object sender, System.EventArgs e)
{
if (Session["KullaniciAdi"] == null)// kullanıcının girişte yazmis oldugu isim veritabanından okunur
{
Response.Redirect("default.aspx");
}
welcome.InnerHtml = "Merhaba " + Session["KullaniciAdi"] + ", yeni konu ekleyebilir veya mevcut olan konulara bakabilirsiniz.<P>";
ListKonular();
}
public void ListKonular()
{
string strConnect = "Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=" + Server.MapPath(".dbforum.mdb");
string strSelect = "SELECT * FROM Konular ORDER BY KonuTarihi DESC";
try
{
//Yeni baglanti yaratiyoruz
OleDbConnection objConnect = new OleDbConnection(strConnect);
//veritabanı ile baglantiyi açiyoruz
objConnect.Open();
OleDbCommand objCommand = new OleDbCommand(strSelect, objConnect);
OleDbDataReader objDataReader;
objDataReader = objCommand.ExecuteReader();
DataGrid1.DataSource = objDataReader;
DataGrid1.DataBind();
if (DataGrid1.Items.Count == 0) // Eger konuya mesaj yazilmamissa mesaj verdiriyoruz.
{
outError.InnerHtml = "Henüz Mesaj Yazilmamis..";
}
//DataReader ve veritabanı Baglantisini Kapatiyoruz
objDataReader.Close();
objConnect.Close();
}
catch (Exception objError)
{
outError.InnerHtml = "<b>* veritabanına baglanti hatasi</b>.<br />"
+ objError.Message + "<br />" + objError.Source; //Hata varsa mesaj yazdiriyoruz.
return;
}
}
}
Forum yetkilisinin istenmeyen konu veya mesajlari silmesi için KayitSilme.aspx i olusturalim
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="KayitSilme.aspx.cs" Inherits="KayitSilme" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Kayit silme</title>
</head>
<body>
<div id="outError" runat="server">
</div>
</body>
</html>
KayitSilme.aspx.cs ye asagidaki kodlari yaziyoruz.
using System;
using System.Data;
using System.Data.OleDb;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class KayitSilme : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
string strConnect = "Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=" + Server.MapPath(".dbforum.mdb"); // veritabanı Baglanti Cümlesi
string strDELETE = "DELETE * FROM ";// String değer olusturuyor
string strURL;
if (Request.QueryString["T"] == "T")
{
strDELETE += "Konular WHERE KonuID = " + Request.QueryString["ID"]; // Silinecek konu KonuID sine bakilip silinmek üzere strDELETE degiskenine atanir.
strURL = "Konular.aspx";
}
else
{
strDELETE += "Mesajlar WHERE MesajID = " + Request.QueryString["ID"];// Mesaj silmek için MesajID sine bakilip silinmek üzere strDELETE degiskenine atanir.
strURL = "Mesajlar.aspx?ID=" + Request.QueryString["TID"] + "&S=" + Request.QueryString["S"];
}
try
{
OleDbConnection objConnect = new OleDbConnection(strConnect); // Yeni baglanti yaratiyoruz
objConnect.Open();// veritabanı ile baglantiyi açiyoruz.
OleDbCommand objCommand = new OleDbCommand(strDELETE, objConnect);// Verilen silme işlemini yapiyoruz
objCommand.ExecuteNonQuery();
objConnect.Close(); // veritabanı ile baglantiyi kapatiyoruz.
Response.Redirect(strURL);
}
catch (Exception objError)
{
outError.InnerHtml = "<b>veritabanınia baglanti hatasi</b>.<br />" + objError.Message + "<br />" + objError.Source; //Hata varsa mesaj yazdiriyoruz.
}
}
}
Ve son olarak ta Mesajlar.aspx i olusturuyoruz.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Mesajlar.aspx.cs" Inherits="Mesajlar" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Mesajlar</title>
<script type="text/javascript" Language="JavaScript">
function Validate(theForm)
{
if (theForm.frmPost.value == "")
{
alert("Lütfen Mesajinizi Yaziniz.");
theForm.frmPost.focus();
return (false);
}
return (true)
}
</script>
</head>
<body>
<form id="AddPosting" method="post" runat="server" onSubmit="return Validate(this)">
<h2> Basit Forum</h2>
<div ID="KonuBasligi" Runat="server">
</div>
<p>
Ilkbasta Girilen Kullanici Adi Ile Foruma Yeni Mesaj Ekliyoruz
</p>
<div id="Div1" runat="server">
<table cellpadding="5" cellspacing="1" border="0" class="DataTable">
<tr>
<td class="TableItem">
Mesaj Yazan :
<asp:Label ID="FrmAdi" Runat="server"></asp:Label>
<br />
Yeni mesaj : (Maksimum 255 Karakter )
<br />
<asp:TextBox id="frmPost" runat="server" TextMode="MultiLine" MaxLength="255" Columns="40" Rows="5"></asp:TextBox>
<table border="0" width="100%" cellspacing="0" cellpadding="0">
<tr>
<td width="100%" align="right">
<asp:Button onClick="DoAddPost" Text="Ekle" Runat="server" id="Button1" CssClass="button"></asp:Button>
</td>
</tr>
</table>
</td>
</tr>
</table>
<br />
<a href="Konular.aspx">Konulara Geri Dön</a>
<br />
</div>
<div id="outError" runat="server">
<asp:DataGrid EnableViewState="False" DataKeyField="MesajID" id="DataGrid1" runat="server" AutoGenerateColumns="False" HeaderStyle-CssClass="TableHeader" AlternatingItemStyle-CssClass="AltTableItem" ItemStyle-CssClass="TableItem" CellPadding="4" ForeColor="#333333" GridLines="None">
<HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White"></HeaderStyle>
<PagerStyle NextPageText="Next >" PrevPageText="< Prev" BackColor="#2461BF" ForeColor="White"
HorizontalAlign="Center"></PagerStyle>
<AlternatingItemStyle BackColor="White"></AlternatingItemStyle>
<ItemStyle BackColor="#EFF3FB"></ItemStyle>
<Columns>
<asp:TemplateColumn HeaderText="Yazar">
<ItemTemplate>
<asp:Label Runat='server' ID="lblAdminLink">
<%# DataBinder.Eval(Container.DataItem, "MesajiYaratan") %>
<% if (Session["admin"] == "yes")
{ %>
<br>
<a href="KayitSilme.aspx?S=<%# Request.QueryString["S"] %>&TID=<%# Request.QueryString["ID"] %>&T=P&ID=<%# DataBinder.Eval(Container.DataItem, "MesajID") %>">
Sil</a>
<% }
%>
<br>
</asp:Label>
</ItemTemplate>
</asp:TemplateColumn>
<asp:BoundColumn DataField="Mesaj" HeaderText="Mesaj"></asp:BoundColumn>
<asp:BoundColumn DataField="MesajTarihi" HeaderText="Yazildigi Tarih"></asp:BoundColumn>
</Columns>
<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<EditItemStyle BackColor="#2461BF" />
<SelectedItemStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
</asp:DataGrid>
</div>
</form>
</body>
</html>
Mesajlar.aspx.cs ye asagidaki kodu yaziyoruz.
using System;
using System.Data;
using System.Data.OleDb;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class Mesajlar : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
if (Session["KullaniciAdi"] == null)
{
Response.Redirect("default.aspx");
}
FrmAdi.Text = "<b>" + Session["KullaniciAdi"].ToString() + "</b>";
ListMesajlar();
}
private void ListMesajlar()
{
string strConnect = "Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=" + Server.MapPath(".dbforum.mdb");
string strSelect = "SELECT * ";
strSelect += "FROM Mesajlar ";
strSelect += "WHERE KonuID=" + Request.QueryString["ID"] + " ";
strSelect += "ORDER BY MesajTarihi DESC;";
try
{
OleDbConnection objConnect = new OleDbConnection(strConnect);
objConnect.Open();
OleDbCommand objCommand = new OleDbCommand(strSelect, objConnect);
OleDbDataReader objDataReader;
objDataReader = objCommand.ExecuteReader();
DataGrid1.DataSource = objDataReader;
DataGrid1.DataBind();
if (DataGrid1.Items.Count == 0)
{
outError.InnerHtml = "Henüz Mesaj Yazilmamis..";
}
KonuBasligi.InnerHtml = "<h4>" + Request.QueryString["S"] + "</h4>";
objDataReader.Close();
objConnect.Close();
}
catch (Exception objError)
{
outError.InnerHtml = "<b>* veritabanına baglanti hatasi</b>.<br />" + objError.Message + "<br />" + objError.InnerException + "<P>" + objError.Source + "<P>" + objError.StackTrace + "<P>" + strSelect;
return;
}
}
public string AdminVisible()
{
if (Session["admin"] == "yes")
{
return " Visible=true";
}
else
{
return "";
}
}
public void DoAddPost(object sender, System.EventArgs e)
{
string strConnect = "Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=" + Server.MapPath(".dbforum.mdb");
string strInsert = "INSERT INTO Mesajlar (Mesaj, MesajiYaratan, KonuID) VALUES ('" + frmPost.Text + "', '" + Session["KullaniciAdi"].ToString() + "', " + Request.QueryString["ID"] + " )"; try
{
OleDbConnection objConnect = new OleDbConnection(strConnect);
objConnect.Open();
OleDbCommand objCommand = new OleDbCommand(strInsert, objConnect);
objCommand.ExecuteNonQuery();
objConnect.Close();
Response.Redirect("Mesajlar.aspx?ID=" + Request.QueryString["ID"] + "&S=" + Request.QueryString["S"], true);
}
catch (Exception objError)
{
outError.InnerHtml = "<b>* veritabanına baglanti hatasi</b>.<br />"
+ objError.Message + "<br />" + objError.Source;
return;
}
}
}