پروژه ساخت و طراحی DLL و UserControl های مجید آنلاینی!

MDP

Well-Known Member
سلام به همه دوستان خوبم!

از امروز می قصد دارم این بخش رو یکم پر جنب و جوش کنم .

قراره که توی این تاپیک DLL ها و Usercontrol های دست ساز و مفید خدمون رو بزاریم و در موردش اطلاعات کاملی مثل :

  1. نام
  2. ورژن .Net
  3. کارایی
  4. کلاس های موجود
  5. سورس کد کامل
  6. تاریخ ساخت
  7. و ...

رو بزاریم!

می دونم همه می دنید ولی می خوام برای خودم یاد آوری کنم که:

  1. جدل ممنوع هست
  2. فقط پست ها در مورد Dll و Usercontol هست
  3. برای تشکر فقط از دکمه تشکر استفاده می کنیم!
  4. سوالی هم اگه داریم توی این تاپیک بحث میشه روش!

ممنون از همتون که کمکم می کنید!

مسعود!
 

arman92

Member
ماژول شمارشگر و آمار بازدید

ماژولی خودم طرای کردم : ماژول Counter (شمارشگر - آمار) برای وب سایت های .Net .

این ماژول از 1 جدول استفاده می کنه و یک کلاس.


کارکرد این ماژول به این صورت است که با هر بار لود (Load) شدن صفحه توسط کاربر ، مقداری را به یک فیلد از جدولی در دیتابیس اضافه می کند.
هر روز ، برای خود یک فیلد دارد. به این معنا که با هر بازدید ، مقداری به فیلد روز مربوطه اضافه می شود.
شناسه ی هر روز ، شماره ی آن روز از 365 روز سال است. برای مثال ، امروز ، روز 340 از 365 روز سال است (میلادی).
این ماژول ، سه مقدار به صفحه بازمی گرداند : بازدید های امروز ، بازدید های دیروز ، بازدید های کل.
جدول (Table) مورد نظر ما ، با نام Visits انتخاب شده است و دارای فیلد های زیرمی باشد :
1- "DayID" از نوع Int و Primary Key
2- "DayOfYear" از نوع Int
3- "Year" از نوع Int
4- "TodayVisits" از نوعBigint
فیلد اول ، DayID برای مشخص کردن شناسه ی روز ، (سهولت در مدیریت با استفاده از شناسه ی روز)
فیلد دوم ، برای مشخص کردن شماره ی روز از 365 روز سال
فیلد چهارم ، سال حاضر
فیلد پنجم ، تعداد بازدید های امروز

Stored Procedure مورد نیاز :
InsertNewDayToVisits : کار این SP ، اضافه کردن رکورد روز حاضر در جدول Visits است. (در صورت عدم وجود)
آنچنان که پس از ساخت یک SP با نام InsertNewDayToVisits در دیتابیس ، محتوای آن را بدین صورت تغییر دهید :
PHP:
[left][font=Courier New][color=blue]1-        ALTER PROCEDURE dbo.InsertNewDayToVisits[/color][/font]
[font=Courier New][color=blue]2-        ([/color][/font]
[font=Courier New][color=blue]3-        @DayOfYear int,[/color][/font]
[font=Courier New][color=blue]4-        @Year int,[/color][/font]
[font=Courier New][color=blue]5-        @TodayVisits int = 1[/color][/font]
[font=Courier New][color=blue]6-        )[/color][/font]
[font=Courier New][color=blue]7-        AS[/color][/font]
[font=Courier New][color=blue]8-         SET NOCOUNT ON [/color][/font]
[font=Courier New][color=blue] [/color][/font]
[font=Courier New][color=blue]9-        Declare @LastDayID int[/color][/font]
[font=Courier New][color=blue]10-      Set @LastDayID = (Select Max(DayID) From Visits)[/color][/font]
[font=Courier New][color=blue]11-      IF @LastDayID IS Null[/color][/font]
[font=Courier New][color=blue]12-      Begin[/color][/font]
[font=Courier New][color=blue]13-      Set @LastDayID = 0[/color][/font]
[font=Courier New][color=blue]14-      END    [/color][/font]
[font=Courier New][color=blue][/color][/font]
[font=Courier New][color=blue]15-      INSERT INTO [Visits] ([DayID], [DayOfYear], [Year],   [TodayVisits]) [/color][/font]
[font=Courier New][color=blue]16-      VALUES ((@LastDayID +1), @DayOfYear, @Year, @TodayVisits);[/color][/font]
[font=Courier New][color=blue][/color][/font][/left]

سطر های 3 تا 5 ، پارامتر های مورد نیاز را Declare می کنند.
سطر 9 ، پارامتر را به صورت محلی ایجاد می کند( از نوع داده ای عدد صحیح).
سطر 10 ، بیشترین مقدار DayID را از جدول Visits می خواند و در پارامتر ایجاد شده قرار می دهد.
سطر 11 ، در صورتی که تا کنون فیلدی در جدول ساخته نشده است ( برای اولین بار ماژول اجرا می شود) ، پارامتر ایجاد شده را برابر با صفر قرار می دهد.
سطروط 15 و 16، مقادیر را در جدول درج می کند. بدین صورت که پارامتر @LastDayID را بعلاوه ی 1 می کند و سپس در جدول قرار می دهد.
حالا به شرح کلاس و متد های عملگر می پردازیم :
کلاسی با نام Counter در پروژه ایجاد می کنیم .(روی پوشه ی App_Code راست کلیک کرده ، New Item را انتخاب و آیتم Class را انتخاب کنید. نام فایل را Counter انتخاب کنید.)
در قسمت NameSpace های کلاس ، System.Data.SqlClient را اضافه کنید.
بدین صورت :
PHP:
using System.Data.SqlClient;
در کلاس Counter فیلد های مورد نیاز در کلاس را مشخص می کنیم :
PHP:
[left]       private static string _connectionString = ConfigurationManager.ConnectionStrings["VinDBConnectionString"].ConnectionString;
        public static string ConnectionString
        {
            get { return _connectionString; }
        }[/left]
[right][right] [/right][/right]
[left]        private static string _prevDayVisits = "";
        public static string PrevDayVisits
        {
            get { return _prevDayVisits; }
            set { _prevDayVisits = value; }
        }
 
        private static string _todayVisits = "";
        public static string TodayVisits
        {
            get { return _todayVisits; }
            set { _todayVisits = value; }
        }
 
        // Declaring the most used Objects :
        static int  dayOfYear = DateTime.Now.DayOfYear;
        static int  year = DateTime.Now.Year;
 
        public static SqlConnection con = new SqlConnection(ConnectionString);
        public static DataSet dSet = new DataSet();
        public static DataRow dRow;
        public static SqlDataAdapter dAdabter = new SqlDataAdapter();
[/left]

فیلد اول که با نام ConnectionString نام گذاری شده است ، رشته ی اتصال را از فایل Web.Config گرفته و در فیلد ConnectionString قرار می دهد. توجه کنید که در اینجا ، نام رشته ی اتصال در فایل Web.Config ، VinDBConnectionString است ؛ لذا شما می بایست نام رشته ی اتصال خود را در این قسمت وارد کنید.
فیلد PrevDayVisits ، برای Set کردن و گرفتن تعداد بازدید های روز قبل به کار می رود که در متد هایی که بعداً خواهیم نوشت ، مقدار دهی و استفاده می شود.
فیلد TodayVisits ، برای Set کردن و گرفتن تعداد بازدید های روز حاضر استفاده می شود.
متغیر dayOfYear ، که از نوع عدد صحیح می باشد ، برای گرفتن شماره ی روز حاضر و متغیر year که نیز از نوع عدد صحیح است ، برای گرفتن سال حاضر به کار می رود.
شی con از نوع SqlConnection برای اتصال به دیتابیس به کار می رود و با فیلد ConnectionString که در بالا ساختیم ، مقدار دهی می شود.
شی dSet از نوع DataSet برای قرار دادن Table ها و شی dRow از نوع DataRow برای مشخص کردن سطر های جدول.
شی dAdabter از نوع DataAdabter برای عمیلات Fill در dSet.

پس از اعلان فیلد ها و متغیر های مورد نیاز ، به متد های عملگر می رسیم :
متد GetTodayVisits() از نوع string.
این متد ، همانطور که از نامش پیداست ، کار گرفتن بازدید های روز حاضر را از دیتا بیس انجام می دهد.
در صورتی که تا کنون هیچ بازدیدی نشده (در روز حاضر) متد دیگری را با نام CreateTodayRow()فراخوانی می کند که کار ساختن سطر مربوط به روز حاضر را انجام می دهد.
PHP:
[left][font=Courier New][color=blue]public static string GetTodayVisits()[/color][/font]
[font=Courier New][color=blue]{[/color][/font]
[font=Courier New][color=blue]   1- SqlCommand getCmd = new SqlCommand();[/color][/font]
[font=Courier New][color=blue]   2- getCmd.CommandText = "Select TodayVisits From Visits Where(DayOfYear = " + dayOfYear + ") And (Year = " + year + ")";[/color][/font]
[font=Courier New][color=blue]   3- getCmd.Connection = con;[/color][/font]
[font=Courier New][color=blue]   4- dAdabter.SelectCommand = getCmd;[/color][/font]
[font=Courier New][color=blue]   5- dSet.Clear();[/color][/font]
[font=Courier New][color=blue]   6- dAdabter.Fill(dSet, "Visits");[/color][/font]
[font=Courier New][color=blue]   7- if (dSet.Tables[0].Rows.Count == 1 )[/color][/font]
[font=Courier New][color=blue]   8- {[/color][/font]
[font=Courier New][color=blue]   9-     dRow = dSet.Tables[0].Rows[0];[/color][/font]
[font=Courier New][color=blue]   10-    int todayVisits = Convert.ToInt32(dRow["TodayVisits"].ToString());[/color][/font]
[font=Courier New][color=blue] [/color][/font]
[font=Courier New][color=blue]   11-    PurseTodayVisits(todayVisits);[/color][/font]
[font=Courier New][color=blue]   12-    TodayVisits = todayVisits.ToString();[/color][/font]
[font=Courier New][color=blue]   13-   return TodayVisits;[/color][/font]
[font=Courier New][color=blue]   14- }[/color][/font]
[font=Courier New][color=blue]   15- if (dSet.Tables[0].Rows.Count == 0)[/color][/font]
[font=Courier New][color=blue]   16- {[/color][/font]
[font=Courier New][color=blue]   17-     CreateTodayRow();[/color][/font]
[font=Courier New][color=blue]   18-     return "1";[/color][/font]
[font=Courier New][color=blue]   19-  }[/color][/font]
[font=Courier New][color=blue]   20-  return TodayVisits;[/color][/font]
[font=Courier New][color=blue][right]}[/right][/color][/font][/left][font=Courier New][color=blue][right][/right][/color][/font]
[font=Courier New][color=blue][left][/left][/color][/font]
سطر 1 ، شی getCmd را از نوع SqlCommand ایجاد و مقدار دهی می کند.

سطر 2 ، خاصیت فرمان (CommandText) ، getCmd را مشخص می کند. (تعداد بازدید های امروز را از دیتابیس انتخاب می کند ، به شرطی که شماره ی روز و سال آن ، با متغیرهای dayOfYear و year برابر باشند)
سطر 3 ، شی اتصال را مشخص می کند.
سطر 4 ، خاصیت SelectCommand شی dAdabter را برابر با getCmd قرار می دهد.
سطر 5 ، جدول های داخل dSet را پاک می کند.
سطر 6 ، dSet را با جدولی که از دیتابیس بازگردانده می شود ، پر می کند.
سطر 7 ، ساختار شرطی if – else را نمایان می کند که در صورت عدم وجود سطر روز حاضر ، متد CreateTodayRow را فرا خوانی می کند (سطر 17) و در غیر اینصورت ، شی dRow را با سطری که از دیتا بیس در dSet ذخیره شده است مقدار دهدی می کند (سطر 9).
در سطر 10 ، متغیر todayVisits را ایجاد و با فیلد TodayVisits که در شی dRow وجود دارد مقدار دهی می کنیم.
در سطر 11 ، متد PurseTodayVisits فراخوانی می شود و متغیر todayVisits به صورت پارامتر برایش ارسال می شود. فیلد
در سطر 12 ، TodayVisits که در اول کلاس تعریف شد ، با متغیر todayVisits مقدار دهی می شود.
در سطر 13 ، فیلد TodayVisits که مقدار دهی شده است به صفحه بازگردانده می شود.
در سطر 15 ، ساختار شرطی if مشخص می کند در صورتی که هیچ رکوردی برای روز حاضر در جدول وجود ندارد ، ابتدا متد CreateTodayRow() را فراخوانی و سپس مقدار 1 را به عنوان بازدید های امروز بازمی گرداند.

شرح متد GetTodayVisits() به پایان رسید. اکنون به توضیح متد CreateTodayRow() می پردازیم :


  • PHP:
     public static void CreateTodayRow(){SqlCommand crtCmd = new SqlCommand();crtCmd.CommandText = "InsertNewDayToVisits";crtCmd.Connection = con;crtCmd.CommandType = CommandType.StoredProcedure;crtCmd.Parameters.AddWithValue("DayOfYear", dayOfYear);crtCmd.Parameters.AddWithValue("Year", year);con.Open();[left]10.crtCmd.ExecuteNonQuery();[/left]
    PHP:
    [left][/left]
    PHP:
    [left]
    [font=Courier New][color=blue]11.con.Close();[/color][/font]
    [font=Courier New][color=blue]12.}[/color][/font][/left][font=Courier New][color=blue][/color][/font]
    [font=Courier New][color=blue][/color][/font]
    در سطر 3 ، شی crtCmd را ایجاد می کنیم. و سپس دستور آن را برابر با InsertNewDayToVisits قرار می دهیم که همان Stored Procedure ای هست که در اول مبحث توضیح داده شد. سپس ، اتصال این SqlCommand را برابر با con می گذاریم که در اول کلاس تعریف شد. سپس نوع دستوری شی crtCmd را برابر با StoredProcedure قرار می دهیم.
سپس چون در SP به دو پارامتر DayOfYear و Year نیاز داریم ، آنها را بصورتی که در خطوط 7 و 8 آمده است ، اضافه و مقدار دهی می کنیم.
در سطر 0 ، شی اتصال خود را باز می کنیم.
سپس با استفاده از متد ExecuteNonQuery() ، تغییرات را در دیتا بیس اعمال می کنیم.
در آخر کار نیز شی اتصال را می بندیم.

متد PurseTodayVisits ، کار اضافه کردن مقدار 1 را به رکورد روز حاضر انجام می دهد. زیرا با هر بازدید از صفحه ، می بایست تعداد بازدید ، بعلاوه ی 1 شود.
این متد به یک پارامتر به نام todayVisitsنیاز دارد که توسط متد GetTodayVisits() به آن پاس داده می شود. این پارامتر ، بازدید های امروز را مشخص می کند.


  • PHP:
     public static void PurseTodayVisits(int todayVisits){todayVisits = todayVisits + 1 ;SqlCommand purseCmd = new SqlCommand();purseCmd.Connection = con;purseCmd.CommandText = "Update [Visits] Set [TodayVisits] = " + todayVisits.ToString() + " Where(([DayOfYear] =" + dayOfYear + "))" ;con.Open();purseCmd.ExecuteNonQuery();con.Close();[left]10.}[/left]
    PHP:
    [font=Courier New][color=blue][/color][/font]
    در سطر 3 ، مقدار پارامتر را بعلاوه ی 1 می کنیم.
در سطر 4 ، شی purseCmd را از نوع SqlCommand ایجاد می کنیم. سپس اتصال آن را برابر با con قرار می دهیم.
در سطر 6 ، دستور شی را به شکلی می نویسیم که فیلد TodayVisits ، در رکورد مربوط به روز حاضر را مساوی مقدار پارامتر (بعلاوه 1) کند. در سطر 7 ، اتصال را باز می کنیم.
در سطر 8 ، با استفاده از متد ExecuteNonQuery() ، دستورات را اجرا می کنیم.
سپس اتصال را می بندیم.

در اینجا به شرح متد GetPrevDayVisits() می پردازیم ، همانطور که از نامش پیداست ، این متد کار گرفتن بازدید های روز قبل را انجام می دهد.


  • PHP:
     public static string GetPrevDayVisits(){SqlCommand prevDCMD = new SqlCommand();prevDCMD.Connection = con;prevDCMD.CommandText = "Select Top(2) TodayVisits, DayOfYear  From Visits Order By DayID DESC";dSet.Clear();dAdabter.SelectCommand = prevDCMD;dAdabter.Fill(dSet, "Visits");dRow = dSet.Tables[0].Rows[1];[left]10.  int lastDay = dayOfYear - 1;[/left]
    PHP:
    [font=Courier New][color=blue]if (Convert.ToInt32(dRow["DayOfYear"].ToString()) == lastDay) {string prevDayVisits = dRow["TodayVisits"].ToString();PrevDayVisits = prevDayVisits;return PrevDayVisits;}else {return "0";}return PrevDayVisits;}[/color][/font]
در سطر 3 ، شی prevDCMD را برای معین کردن دستور Select ایجاد می کنیم.
در سطر 5 ، متن دستور شی را مشخص می کنیم. بدین صورت که دو رکورد اول را از دیتابیس با دو فیلد TodayVisits و DayOfYear ، Select می کنیم. Order By DayID DESC مشخص می کند که به صورت نزولی ، 2 رکورد را بر حسب شناسه روزشان مرتب می کند. یعنی اگر دو رکورد با DayID های 5 و 6 داشته باشیم ، اول 6 و سپس 5 مرتب می شوند.
سپس با استفاده از متد Clear() ، جدول های موجود از قبل در DataSet را پاک می کنیم.
در سطر 7 ، خاصیت SelectCommand شی dAdabter را برابر با prevDCMD قرار می دهیم. و در سطر بعد ، dSet را از جدولی که از دیتابیس بازگردانده می شود ، پر می کنیم.
در سطر 10 ، تغیر lastDay را از نوع عدد صحیح تعریف کرده و مقدار را برابر با متغیر dayOfYear منهای 1 قرار می دهیم (یعنی روز قبل از امروز).
در سطر 11 ، ساختاری شرطی را ملاحظه می کنیم در صورتی که شماره ی روز رکورد بازگردانده شده ، مساوی lastDayبود ، متغیری از نوع رشته تعریف و با فیلد TodayVisits مقدار دهی می شود.
سپس در سطر 14 ، فیلد PrevDayVisits که در اول کلاس معرفی شد ، با متغیر prevDayVisits مقدار دهی می شود. سپس مقداری که در فیلد PrevDayVisits قرار گرفته است ، به صفحه بازگردانده می شود.
در صورتی که شرط بالا برقرار نبود ، مقدار 0 بازگردانده می شود. یعنی در روز قبل ، هیچ بار وب سایت بازدید نشده است.
در سطر 20 نیز برای کاهش دادن درصد خطای برنامه ، دوباره فیلد PrevDayVisits را به صفحه بازمیگردانیم.

آخرین متد نیز ، کار جمع کردن همه ی بازدید ها و بازگرداندن آن را به صفحه انجام می دهد :


  • PHP:
     public static string GetSumVisits(){dSet.Clear();SqlCommand getSumCmd = new SqlCommand();getSumCmd.Connection = con;getSumCmd.CommandText = "Select Sum(TodayVisits) as TotalVisits From Visits";dAdabter.SelectCommand = getSumCmd;dAdabter.Fill(dSet, "Visits");dRow = dSet.Tables[0].Rows[0];[left]10.string totalVisits = dRow["TotalVisits"].ToString();[/left]
    PHP:
    [left][/left]
    PHP:
    [left]
    [font=Courier New][color=blue]11.return totalVisits;[/color][/font]
    [font=Courier New][color=blue]12.}[/color][/font][/left][font=Courier New][color=blue][/color][/font]
    [font=Courier New][color=blue][/color][/font]
    در سطر 3 ، جدول های موجود را در dSet پاک می کنیم.
شی getSumCmd را ایجاد ، شی اتصال آن را مشخص می کنیم و سپس در سطر 6 ، با استفاده از دستور Sum ، مجموع تعداد بازدید ها را از جدولVisits ، Select می کنیم.
در خط 10 ، متغیر totalVisits را از نوع رشته ایجاد می کنیم و با فیلد TotalVisits که از دیتابیس بازگردانده شده است را مقدار دهی می کنیم. در آخر نیز در سطر 11 ، متغیر totalVisits را به صفحه باز می گردانیم.

تا اینجا ، کار ساختن کلاس و متد ها تمام شد. حالا باید از این کلاس در صفحه استفاده کنیم.
برای مثال ، من در MasterPage وبسایتم ، این کلاس را به کار گرفتم. در این صورت با هر بار لود شدن صفحه ، به بازدید های وب سایت اضافه می شود.
برای این کار ابتدا در صفحه ی مورد نظر ، Label هایی با نام های : todayVisits ، prevDayVisits و totalVisits ایجاد کنید.
سپس درCode Behind صفحه ، در رویداد (Event) Page_Load به صورت زیر ، متن Label های ایجاد شده را مقدار دهی کنید :
PHP:
[left][font=Courier New]todayVisits.Text = Counter.GetTodayVisits();[/font]
[font=Courier New]prevDayVisits.Text = Counter.GetPrevDayVisits();[/font]
[font=Courier New]totalVisits.Text = Counter.GetSumVisits();[/font]
[font=Courier New][/font][/left]

بسیار خب ، کار تمام است. در صورتی که اشتباهی پیش نیامده باشد ، این کلاس باید بدرستی کار کند.
در آخر ، فایل های این ماژول را برای دسترسی راحت تر به کد ها در زیر قرار می دهم.
کلاس Counter در فایلی به نام Counter.cs در پوشه ی App_Code قرار دارد. شما نیز باید این فایل را در پوشه ی App_Code پروژه ی خود قرار دهید. فایل Default.aspx نیز کارکرد ماژول را نمایش می دهد. البته در صورتی که تمام مراحل را بدرستی و کامل انجام داده باشید. (تنظیمات ConnectionString در فایل Web.Config ، Stored Procedure ، Table و کلاس Counter)
لینک دریافت فایل ها :
http://arman15.parsaspace.com/learn/CounterModule/Files.zip
لینک دانلود آموزش ساخت این ماژول به صورت ورد (doc.) :
http://arman15.parsaspace.com/learn/CounterModule/CounterModuleLearn.doc

دوستان من که نفهمیدم ! چرا این ادیتور ویبولیتن اینجوری می کنه با ما!

از مدیر محترم درخواست دارم این مطلب رو خودشون ویرایش کنن. ممنون.
 
آخرین ویرایش:

lolita&tiyam

New Member
چگونه میشه تو c#
ارایه تعریف کرد واسم با یک مثال توضیح بدید لطفا
مثل دریافت نام و نام خوانوادگی با ارایه و نمایش ان ها و امکان جستجوی ان ها
تا7 بهمن فرصت دارم
ممنون
 

milade

Member
سلام
اولا اینجا جای این سوالات نیست . یعنی بخشش نیست !
بهتره از هش تیبل استفاده کنی
در حال اگه اطلاعات بیشتری میخوای تاپیک جدید بزن تا بگم ف وگرنه پستت به وسیله مدیر که پاک میشه هیچ ، جریمه هم داری !
پس این پستت رو پاک کن ، و تاپیک جدید بزن تا جواب بدم
(این پست برای این ارسال شد چون پیام خصوصی این کاربر بسته بود :d )
 

saberahmady

Member
کاری کرده قشنگ و ساده است
بهتر بود از try, catch هم استفاده می کردید تا خطاهای احتمالی مثلا باز کردن کانکشنی که هنوز بسته نشده هم رفع می شد

در هر صورت ممنون
در ضمن لینک فایل هم خراب است
 

tarenoco

Member
از یه همچین کدی چطوری میشه تو قالب html استفاده کرد ؟
ممنون میشم راهنمایی کنید
 

جدیدترین ارسال ها

بالا