تبليغاتX
CSharp

CSharp

آموزش نکات کاربردی زبان برنامه نویسی سی شارپ

ایجاد منوی pop up و عمل دراگ کردن

شاید تو بعضی برنامه ها لازم باشه برای راحتی کار، منویی بذاریم که با راست کلیک کردن ظاهر بشه و هر قسمتش کار خاصی رو انجام بده یا تابع خاصی رو فراخوانی بکنه.

برای اینکار، می تونیم از ابزاری به نام ContextMenu به صورت زیر استفاده کنیم.

این ابزار مثل همون منوی عادیه منتها در بالای فرم نشان داده نمی شه. با کلیک کردن روی قسمت های مختلف اون می توانیم زیر منوهامون رو درست بکنیم و نام گذاری کنیم.

حالا فرض کنید که دو زیر منو به نامهای Copy , Move ایجاد کردیم. و فرض کنید که دو تا TextBox به نامهای Text1,Text2 داریم.و همچنین یک RichTextBox به نام RText1 داریم. روال کار اینجوریه که، در Text1,Text2 متنی می نویسیم و آن رو به داخل RText1 دراگ(Drog and Drop) می کنیم. با این تفاوت که بعد دراگ کردن متن داخل Text1 کات(Cut) میشه ولی متن داخل Text2 کپی میشه و اگر عمل دراگ رو با دکمه سمت راست موس(راست کلیک) انجام دادیم، داخل Rtext1 به جای کپی یا کات کردن منویی ظاهر بشه و از کاربر بپرسه که کپی کنه یا کات کنه.

کد مربوط به Text1 :

private void Text1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

{

       sourceControl = textBox1;

       mouseButton  = e.Button;

       textBox1.DoDragDrop(textBox1.Text, DragDropEffects.Move | DragDropEffects.Copy);

}

sourceControl: به کمک این می تونیم شی مبدا رو مشخص کنیم. (مثلا می خواهیم کپی کنیم، پس باید دونیم از کجا به کجا کپی صورت بگیره. به کمک این دستور شی مبدا رو کنترل می کنیم.)

mouseButton: به کمک این دستور کیلد موس که فشار داده شده و مشخص می کنیم. (این دستور رو داخل رویداد MouseDown نوشته ایم.)

DoDragDrop(): به کمک این متد مشخص می کنیم که عمل کشیدن چه تغییری در شی مشخص شده اعمال بکند(کپی کند یا کات کند)، که اینجا گفتیم که هم کپی کند هم کات کند. یعنی بعد از کپی کردن متن، مقدارش پاک بشه.

متن مربوط به Text2:

private void Text2_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

{

       sourceControl = textBox1;

       mouseButton  = e.Button;

       textBox1.DoDragDrop(textBox1.Text, DragDropEffects.Copy);

}

این هم شبیه Text1 است با این تفاوت که اینجا متن فقط کپی میشه.

کد مربوط به RText1:

private void RText1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)

{

       sourceData = e.Data.GetData(DataFormats.Text, true).ToString();

       if (mouseButton == MouseButtons.Right)

       {

              mnuCopy.Visible = ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy);

              mnuMove.Visible = ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move);

              contextMenu1.Show(RText1, new Point(20,20));

       }

       else

       {

              deleteSource = (e.Effect == DragDropEffects.Move);

              ProcessData();

      }

}

sourceData: مقداری که کپی یا کات شده در آن قرار می گیره.

اگر با کلیک راست دراگ کرده باشیم، زیر منوهای کپی و کات از منوی ContextMenu ظاهر میشن و نشان داده میشن. البته در مختصاتی که بهش می دیم.(اینجا گفتیم در نقطه 20 و 20 از شی RText1 منو ظاهر بشه.)و اگر راست کلیک نباشه، و جاهایی که کات کردیم(در Text1) مقدار True رو برامون بر گردونه.

 

تابع ProcessData() به صورت زیره:

private void ProcessData()

{

      RText1.Text = sourceData;

       if (deleteSource)

       {

          Text1.clear();

       }

       sourceControl = null;

       mouseButton  = MouseButtons.None;

       deleteSource = false;

}

اینجا مقداری رو که درگ کردیم رو داخل RText1 کپی کنه. اگه مقدار deleteSource درست باشه(True) مقدار Text1 رو پاک بکنه. و آخر سر متغیرهای کمکی که استفاده کردیم، مقدارشون رو پاک کنه.

حالا فقط مونده توابعی که برای کپی یا کات استفاده کردیم.

private void Copy_Click(object sender, System.EventArgs e)

{

       deleteSource = false;

       ProcessData();

}

private void Move_Click(object sender, System.EventArgs e)

{

       deleteSource = true;

       ProcessData();

}

این توابع هم فقط deleteSource رو مقدار دهی می کنن. اگه True باشه یعنی کپی، اگه False باشه یعنی کات.

+ نوشته شده در  چهارشنبه دوازدهم خرداد 1389ساعت 15:16  توسط عارف دوستکامی  | 

ذخیره و بازیابی اطلاعات در فایل XML

نحوه ذخیره اطلاعات در فایل XML

فرض کنید برنامه ای نوشته اید که نیاز دارید یک سری اطلاعات رو از برنامه گرفته و در خارج از برنامه ذخیره کنید. شاید اولین چیزی که به ذهنتان برسد، کار با بانک ها باشد و یا استفاده از فایل متنی.

ولی بهترین راه استفاده از فایل xml است. این نوع فایل قابلیت ذخیره اطلاعات را با هر قالبی که کاربر خواست دارد. در حقیقت می توان یک سری رکورد یا هر اطلاعات قالب مندی را در آن ذخیره کرد. به عنوان مثال می توانید تاریخ انقضا برنامه خود را به صورت رمز در آورده و در یک فایل xml قرار دهید.

در سی شارپ برای کار با این نوع فایل امکانات ویژه ای قرار دارد. که با ذکر یک مثال آنها را شرح می دهیم.

فرض کنید که فرمی طراحی کرده ایم که شامل دو قسمت کلی است. یکی نام و نام خانوادگی کاربر و دیگری نام کاربری و تاریخ انقضا نام کاربری.

ابتدا دکمه ای قرار می دهیم که بعد از ورود اطلاعات این دو بخش یک فایل xml برای ما در مسیر خاصی ایجاد کند.

XmlTextWriter XmlWrt = new XmlTextWriter("AppXml.xml", System.Text.Encoding.UTF8);

XmlWrt.Formatting = Formatting.Indented;

XmlWrt.WriteStartDocument();

XmlWrt.WriteStartElement("configuration");

XmlWrt.WriteStartElement("general");

XmlWrt.WriteElementString("Name", "Name of User");

XmlWrt.WriteElementString("Familly", "Familly of User");

XmlWrt.WriteEndElement();

XmlWrt.WriteStartElement("Info");

XmlWrt.WriteElementString("User", "UserName");

XmlWrt.WriteElementString("DateExp", "Date of Expire");

XmlWrt.WriteEndElement();

XmlWrt.WriteEndElement();

XmlWrt.WriteEndDocument();

XmlWrt.Close();

ابزاری XmlTextWriter برای ایجاد یا نوشتن در یک فایل Xlm کاربرد دارد. در این مثال ن.ع فرمت اطلاعات را از نوع Utf8 انتخاب کرده ایم. و از برنامه خواستیم تا اطلاعات یا رکورد ا را به صورت تو در تو (Indented) یا سطح بندی شده ذخیره بکند.

 WriteStartDocument(): برای شروع کار یک بار باید نوشته شود.

WriteEndDocument() : برای اعلام اتمام کار باید ذکر شود.

WriteStartElement(String) : برای ایجاد یک سطح یا شاخه مورد استفاده قرار می گیرد.

WriteElementString(FieldName,StringValue) : برای مقدار دهی فیلدها با ذکر نام آنها بکار می آید.

WriteEndElement() : برای بستن هر شاخه یا سطح مورد استفاده قرار می گیرد.

XmlWrt.Close() برای آزاد کردن شی مورد نظر مورد استفاده قرار می گیرد.

با اجرای این دستور در مسیر جاری فایلی با نام AppXml.xml ایجاد می شود و اطلاعات زیر در آن ذخیره می شود.

 

  Name of User

  Familly of User

 

  UserName

  Date of Expire

 

 به هر کدام از اطلاعاتی که داخل علامتهای بزرگتر و کوچکتر (تگ) هستند، یک گره (Node) می گویند.

 

نحوه بروز کردن تغییرات در فایل XML

XmlDocument XmlDoc = new XmlDocument();

XmlDoc.Load("AppXml.xml");

XmlNode nameNode = XmlDoc.SelectSingleNode("configuration/general/Name");

XmlNode famillyNode = XmlDoc.SelectSingleNode("configuration/general/Familly");

XmlNode userNode = XmlDoc.SelectSingleNode("configuration/Info/User");

XmlNode dateNode = XmlDoc.SelectSingleNode("configuration/Info/DateExp");

nameNode.InnerText = "new name";

famillyNode.InnerText = "new familly";

userNode.InnerText = "new user name";

dateNode.InnerText = "new date";

XmlDoc.Save("AppXml.xml");

ابزار XmlDocument به کمک متد load اطلاعات فایل خاصی را برای ما به کمک گره هایی که به تگ ها اختصاص می دهیم بر می گرداند.

XmlNode : برای اختصاص داده تگ به نود به کار می رود. مشاهده می کنید که برای دسترسی به یک گره خاص باید تمامی سطوح را تک به تک طی کنیم تا به گره خاص برسیم.

 

نحوه خواندن اطلاعات از فایل XML

string str = "";

XmlTextReader XmlRdr = new XmlTextReader("AppXml.xml");

while(!XmlRdr.EOF)

{

      if (XmlRdr.MoveToContent() == XmlNodeType.Element)

            switch (XmlRdr.Name)

            {

                  case "Name":

                        str=XmlRdr.ReadElementString();

                        break;

                  case "Familly":

                        str+= "\n"+ XmlRdr.ReadElementString();

                        break;

                  case "User":

                        str+= "\n"+ XmlRdr.ReadElementString();

                        break;

                  case "DateExp":

                        str+= "\n"+ XmlRdr.ReadElementString();

                        break;

                  default:

                        XmlRdr.Read();

                        break;

      }

      else

            XmlRdr.Read();

}

      به کمک تابع XmlTextReader می توان اطلاعات را از فایل خواند.

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

while(!XmlRdr.EOF) : به کمک این دستور، مشخص کرده ایم که تا زمانی که به انتهای فایل(End Of File) نرسیده است (تا زمانی که فیلدی باقی مانده) عملیات مورد نظر را انجام بده.

+ نوشته شده در  دوشنبه دهم خرداد 1389ساعت 12:35  توسط عارف دوستکامی  | 

ایجاد برنامه جاسوسی و کنترل اعمال در سی شارپ

ممکن است که در برنامه ای احتیاج داشته باشیم که کلیه عملکردهای کاربران را کنترل کنید، و یا احتیاج داشته باشید تغییرات اعمال شده در فایلها را مشاهده کنید. برای این کار به ابزاری نیاز داریم که به کل فایلهای سیستم تسلط داشته باشد، و هرگونه ایجاد، حذف و یا تغییرات در آنها را حس کند و گزارش دهد.

در سی شارپ ابزاری به نام System Watcher وجود دارد که دقیقا همین کار را برای ما انجام می دهد.

نحوه کار این ابزار را با مثالی ساده می بینیم.

این ابزار شامل چند تا ویژگی یا property ساده است که می توانیم آنها رو از طریق اشیایی مثل TextBox, ComboBox وارد کنیم که ما برای راحتی کار آنها رو از طریق کد برنامه و به صورت دستی وارد می کنیم.

ویژگی ها:

Path: مسیری که می خواهیم کنترل کنیم. (از نوع رشته ای)

Filter: نوع فایل یا فایلهایی که می خواهیم کنترل شوند. (از نوع رشته ای)

IncludeSubdirectories: مجوز کنترل کردن زیر پوشه ها را بدهیم یا ندهیم. (از نوع بولی)

فرض کنید دو دکمه به نامهای Start ,Stop برای کنترل و عدم کنترل وجود داشته باشد. به کد دکمه Start دقت کنید.

private void Start_Click(object sender, System.EventArgs e)

{

      FileMonitor.Path = "C:\WINDOWS\";

      FileMonitor.Filter = "*.*";

      FileMonitor.IncludeSubdirectories = True;

      FileMonitor.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;

      FileMonitor.EnableRaisingEvents = true;

}

در این مثال با فرض اینکه ویندوز در درایو C قرار دارد مسیر پوشه ویندوز را انتخاب کردیم. و می خواهیم تغییرات همه فایلها را مشاهده کنیم. و کنترل را با دستور آخر شروع می کنیم.

کد دکمه Stop: عمل کنترل را متوقف می کند.

private void ButtonStop_Click(object sender, System.EventArgs e)

{

      FileMonitor.EnableRaisingEvents = false;             

}

حالا باید رویدادهای شی System Watcher را اضافه کنیم.

کلا چهار نوع عمل بر روی هر فایلی وجود دارد که شامل: ایجاد، حذف، تغییر در محتویات و تغییر نام هستند. که برای سه نوع اول فقط کافیه از یک رویداد استفاده بکنیم و با آرگومان FileSystemEventArgs  نوع آنها رو مشخص کنیم.

private void FileMonitor_Changed(object sender, System.IO.FileSystemEventArgs e)

{

string ChangeType = e.ChangeType.ToString();

      if (ChangeType=="Created")

      {

            MessageBox.Show("File: " +  e.FullPath + " " + e.ChangeType, e.Name+" Created");

      }

      else if(ChangeType=="Deleted")

      {

            MessageBox.Show("File: " +  e.FullPath + " " + e.ChangeType, e.Name+" Deleted");

      }

      else if(ChangeType=="Changed")

      {

            MessageBox.Show("File: " +  e.FullPath + " " + e.ChangeType, e.Name+" Changed");

      }

}

و برای رویداد تغییر نام از آرگومان تغییر نام(RenamedEventArgs) استفاده می کنیم.

private void FileMonitor_OnRenamed(object source, RenamedEventArgs e)

{

      string originalname = e.OldFullPath;

      string renamed = e.FullPath;

      MessageBox.Show("File: "+originalname+" renamed to "+renamed, e.OldName+" Renamed");

}

با اجرای برنامه، پنجره My Computer را باز کنید، مشاهده می کنید که فایل Shell32.dll تغییر می کند و با پیغامی نشان داده می شود. حالا خودتون یک فایل رو ایجاد بکنید و تغییر نام یا حذف کنید و فایلهای تغییر داده شده را مشاهده کنید.

البته می توانید به صورت کاربردی تر، تغییرات را به جای نشان دادن، در یک بانک همراه نام کاربران ذخیره کنید. معادل همین عمل را می توانید در برنامه Event Viewer که در خود ویندوز قرار دارد، ببینید.

+ نوشته شده در  یکشنبه نهم خرداد 1389ساعت 20:26  توسط عارف دوستکامی  | 

نحوه کنترل خطاها و استثناها

در برنامه نویسی تابع گرا یا شی گرا احتمال نوشتن برنامه هایی که در آن خطا رخ دهد خیلی زیاد است، و حتمال اینکه سیستم عامل نتواند مشکلی برای حل این خطا پیدا کند زیادتر است. پس باید در برنامه نوشتم حد الامکان تمام خطاهای احتمالی را شناسایی کرده و برای آنها پیغام مناسبی به کاربر نشان داد. برای این کار در سی شارپ دستوراتی (blocks)وجود دارد که آنها را تشریح می کنیم.

try

{

 }

catch (Exception ex)

{

}

finally

{

}

در بلاک try باید کد برنامه یا تابع را بنویسیم. اگر احیانا در این برنامه خطایی وجود داشته باشد، اجرای برنامه به قسمت catch می رود و در آنجا با توجه به کدهایی که برای تشخیص خطا می نویسیم، خطا کنترل شود که هیچ وگرنه در هر صورت برنامه به قسمت finally رفته و کدهای آنجا را اجرا می کند.

برای مثال: بخواهیم یک فایل در یک مسیر خاص ایجاد کنیم.

private void Button1_Click(object sender, System.EventArgs e)

{

         System.IO.File.Create("c:\\test2.txt");

}

اگر کاربر اشتباها دو بار این دکمه را فشار دهد، قاعدتا این فایل دو بار ایجاد می شود، و از طرف سیستم عامل بدلیل نداشتن دستوری مبنی بر جایگزینی فایل وقفه ای ایجاد می شود. و برنامه احیانا هنگ می کند. برای جلوگیری از این خطا کد را به صورت زیر اصلاح می کنیم.

try

{

     System.IO.File.Create("c:\\test2.txt");

}

catch

{

}

در این حالت اگر چندین بار دکمه فشار داده شود هیچ عملی صورت نمی گیرد، چوت در بلاک catch هیچ دستوری وجود ندارد.

به مثالی دیگر توجه کنید:

می خواهیم به یک بانک در sql متصل شویم و یک رکورد را درج کنیم.

private void Button1_Click(object sender, EventArgs e)

{

SqlConnection Connection = new SqlConnection("server=localhost;Integrated Security=False;Initial Catalog= MyDataBase;");

SqlCommand command =new SqlCommand ("insert into Tbl1(T_Id)values(100)", Connection);

Connection.Open();

command.ExecuteNonQuery();

Connection.Close();

}

اگر تحت هر شرایطی در هنگام درج دستور مشکلی پیش بیاید، یا مثلا دو بار این رکورد درج شود که کلید اصلی باشد و پیغام خطا صادر شود. برنامه متوقف می شود و کنترل به سیستم عامل بر می گردد. و چون قبل از اجرای دستور، بانک را با دستور Connection.Open() باز کردیم. بانک همچنان باز می ماند، چون دستور آخری اجرا نمی گردد. و در دفعات بعد نمی توانیم به بانک دسترسی داشته باشیم چون همچنان در دسترس قرار می گیرد.

برای رفع این مشکل کد را به اینصورت اصلاح می کنیم.

SqlConnection Connection = new SqlConnection("server=localhost;Integrated Security=False;Initial Catalog= MyDataBase;");

try

{

SqlCommand command = new SqlCommand("insert into Tbl1(T_Id)values(100)", Connection);

Connection.Open();

command.ExecuteNonQuery();

Connection.Close();

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

}

finally

{

Connection.Close();

}

در قسمت catch نوشتیم که هر باری که خطایی رخ داد پیغام آن خطا را از سیستم عامل گرفته و چاپ کند. و در قسمت finally اعلام کردیم که در هر شرایطی از بسته بودن بانک اطمینان حاصل کند.

+ نوشته شده در  جمعه هفتم خرداد 1389ساعت 13:36  توسط عارف دوستکامی  | 

نحوه آپلود عکس در سرور و ذخیره آن در بانک اطلاعاتی

روش اول

در حال حاظر مرسوم ترین روش برای ذخیره عکس و آپلود اون به این صورته که عکس رو به یک مکان در سایت یا سرور کپی می کنند و آدرس آن را در بانک ذخیره می کنند، و برای بازیابی کافیه که آدرس آن رو از بانک بخوانیم و آن را پیمایش بکنیم و از عکس استفاده می کنیم. اما اگر احیانا مجبور شدید که عکی یا هر فایل دیگه ای رو در بانک ذخیره کنید می تونید از کدهایی که گذاشتم استفاده کنید.

روش اول کپی عکس در یک مسیر خاص در سرور و ذخیره اون در بانک

فرض کنید جدولی با مشخصات زیر در یک بانک در sql داریم

CREATE TABLE [Images] (

       [ImageID] [int] IDENTITY (1, 1) NOT NULL ,

 [ImageAdd] [varchar] (100)

)

حالا به کمک یک شی فایل آپلود FileUpload و متدهاش به صورت زیر عمل می کنیم:

if (FileUpload1.FileName.Length > 0)

        {

            string fname = FileUpload1.FileName;

            FileUpload1.SaveAs(Server.MapPath("pictures\\" + fname));

            SqlConnection Connection = new SqlConnection ("server=localhost;Integrated Security=SSPI;Initial Catalog=MyDataBase");

            string address="pictures\\"+fname;

            SqlCommand com1 = new SqlCommand("insert into Images (ImageAdd) values('" + address + "')", Connection);

            Connection.Open();

            com1.ExecuteNonQuery();

            Connection.Close();

        }

به کمک متد FileName نام و پسوند فایل را گرفته و به کمک متد SaveAs فایل را در مسیر دلخواه(در پوشه Picture)ذخیره می کنیم سپس آدرس فایل را گرفته و با همان نام در بانک ذخیره می کنیم.(معمولا نام فایل باید کلید اصلی باشد تا تکرار نشود و نیازی به Replace نباشد).

به کمک متد Server.MapPath می توانیم به ریشه سروری که می خواهیم سایت را در آن آپلود کنیم اشاره کنیم. و به عنوان ورودی مسیر نسبی را وارد می کنیم.

برای بازیابی عکس ها کافیه که از دستورات زیر استفاده کنیم

SqlConnection Connection = new SqlConnection("server=localhost;Integrated Security=SSPI;Initial Catalog=MyDataBase");

        string str = "select ImageAdd from Images";

        SqlDataAdapter data1 = new SqlDataAdapter(str,Connection);

        DataTable tab1 = new DataTable();

        data1.Fill(tab1);

        Image1.ImageUrl = Server.MapPath(tab1.Rows[0][0].ToString().Trim());

در اینجا از یک شی Image برای به نمایش در آوردن عکس ها استفاده کردیم، و آدرس اولین عکسی که از بانک گرفتیم رو به متد ImageUrl آن دادیم تا برامئن نمایش بده.

Trim() این تابع را برای هر رشته ای که بکار ببریم فضاهای خالی را در ابتدا و انتهای آن حدف می کند. از آنجا که طول رشته در sql ثابت است پس در فضاهای اضافه کاراکتر خالی قرار می دهد. و چون ما می خواهیم آدرس کامل را به شی Image بدهیم پس باید کاراکتر های خالی را حذف کنیم.

روش دوم

اگر در هر شرایطی مجبور بودیم که عکس رو در بانک sql ذخیره کنیم از روش زیر استفاده می کنیم.

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

CREATE TABLE [Images] (

       [ImageID] [int] IDENTITY (1, 1) NOT NULL ,

[ImageFile] [image] NULL ,

[ImageSize] [int] NULL ,

[ImageType] [nvarchar] (100)

)

کلید اصلی که به صورت خودکار اضافه می شود و اندازه عکس، نوع عکس و خود عکس را در فیلدهای بالا قرار می دهیم.

حالا به یک شی فایل آپلود و یک دکمه برای ذخیره احتیاج داریم، به صورت زیر.

string ContentType = FileUpload1.PostedFile.ContentType;

int Length = System.Convert.ToInt32(FileUpload1.PostedFile.InputStream.Length);

byte[] Content = new byte[Length];

FileUpload1.PostedFile.InputStream.Read(Content, 0, Length);

SqlConnection Connection = new SqlConnection("server=localhost;Integrated Security=SSPI;Initial Catalog=MyDataBase");

SqlCommand Command = new SqlCommand("INSERT Into Images(ImageFile, ImageSize, ImageType) Values(@Description, @ImageFile, @ImageSize, @ImageType)", Connection);

SqlParameter imageFileParameter = new SqlParameter("@ImageFile", SqlDbType.Image);

imageFileParameter.Value = Content;

Command.Parameters.Add(imageFileParameter);

 

SqlParameter imageSizeParameter = new SqlParameter("@ImageSize", SqlDbType.Int);

imageSizeParameter.Value = Length;

Command.Parameters.Add(imageSizeParameter);

 

SqlParameter imageTypeParameter = new SqlParameter("@ImageType", SqlDbType.NVarChar);

imageTypeParameter.Value = ContentType;

Command.Parameters.Add(imageTypeParameter);

 

Connection.Open();

Command.ExecuteNonQuery();

Connection.Close();

به کمک دستور اول نوع فایل مشخص میشه.(دقت کنید با این روش هر فایلی رو می تونیم در بانک ذخیره بکنیم حتی فایل exe مگر اینکه خودمون براش فیلتر بذاریم)

به کمک دستور دوم اندازه فایل به بایت دست میاد.

به کمک دستور سوم یه آرایه به اندازه فایل ایجاد میشه.

به کمک دستور چهارم تک تک بایت ها از اول تا آخر در آرایه قرار می گیرد.

به کمک دستورات بالا یک کانکشن ایجاد می کنیم فایل رو به صورت ذکر شده در بانک ذخیره می کنیم. البته به جای استفاده از پارامتر inline در داخل دستور sql از ارسال پارامتر به sql استفاده کردیم. این به این دلیل است که در تعریف متغیر image و مقدار دهی دچار مشکل نشویم.

نکته: برای استفاده از دستور SqlParameter باید از فضای نامusing System.Collections استفاده کرد.

نحوه خواندن اطلاعات و نمایش عکس

برای این کار یک صفحه جدید به نام Page2 اضافه می کنیم و لینک های مربوط به عکس ها را طوری در صفحه فعلی می چینیم که به کمک پارامتر به صفحه دوم ارسال شوند.

SqlConnection Connection = new SqlConnection("server=localhost;Integrated Security=SSPI;Initial Catalog=MyDataBase");

SqlCommand Command = new SqlCommand("Select ImageID From Images", Connection);

Connection.Open();

SqlDataReader myDR = Command.ExecuteReader();

while (DR.Read())

        {

                Response.Write("" + DR["ImageID"] + "
"
);

        }

در دستورات بالا کد یا کلید اصلی عکس ها را از بانک خوانده و با پارامتر کد  به صفحه دوم ارسال کردیم.

در صفحه دوم پارامتر را دریافت کرده، به بانک ارسال می کنیم و اطلاعات کامل را از بانک می خوانیم و نمایش می دهیم. به نحوه کار و نحوه تبدیل بایت ها در بانک به عکس دقت کنید.

protected void Page2_Load(object sender, EventArgs e)

    {

        int ImageId = System.Convert.ToInt32(Request.QueryString["ImageId"]);

        SqlDataReader imageContent = GetImages(ImageId);

        imageContent.Read();

        Response.ContentType = imageContent["ImageType"].ToString();

       Response.OutputStream.Write((byte[])imageContent["ImageFile"], 0, System.Convert.ToInt32(imageContent["ImageSize"]));

    }

private SqlDataReader GetImages(int imageId)

    {

        SqlConnection Connection = new SqlConnection("server=localhost;Integrated Security=SSPI;Initial Catalog=MyDataBase");

        SqlCommand Command = new SqlCommand("Select * From Images Where ImageId='"+ imageId +"'", Connection);

        Connection.Open();

       return Command.ExecuteReader(CommandBehavior.CloseConnection);

    }

در لود صفحه سعی شده تا اطلاعات را به کمک تابع GetImages از بانک بخوانیم و در صفحه نمایش دهیم. برای نمایش نیز اطلاعات فیلد عکس را ار بایت اول تا آخر خوانده و با کمک متد OutputStream.Write تبدیل به عکس کردیم.

نکته: به کمک این دستورات و نوع فیلد image در بانک sql می توان هر نوع فایلی را در بانک ذخیره و دوباره بازیابی کرد، فقط نحوه نمایش فایلها متفاوت است.

 

+ نوشته شده در  پنجشنبه ششم خرداد 1389ساعت 19:11  توسط عارف دوستکامی  | 

نحوه ارسال پارامتر در صفحات وب

در سی شارپ این امکان وجود دارد که بتوانیم بین صفحات وب هر نوع داده ای که خواستیم منتقل کنیم.

Session یک نوع متغیر است که هنگامی که ایجاد می شود به صورت خودکار در تمام صفحات سایتمان مشترک خواهد بود و می توانیم  هرجا که لازم شد از مقدارش استفاده کنیم.

معمولا هنگام چک کردن نام کاربری و رمز عبور نام کاربری را در یک سیشن قرار می دهند تا بعد از ورود بتوان در صفحات دیگر از اطلاعات کاربر استفاده کنیم.

یا در انتقال پارامتر به صفحات دیگر از این امکان استفاده کرد. در ساختن صفحات پویا که لینک ها را از بانک اطلاعاتی می خواند و نمایش می دهد تاثیر مستقیم دارد.

نحوه تعریف:

Session["name"]=Value;

Value می تواند شامل هر مقداری باشد، از قبیل عدد صحیح، عدد اعشاری، رشته، آرایه و یا اشیا و کنترل های قابل نمایش در صفحه.

سیشن ها مانند متغیر های استاتیک مقدار خود را تا هر زمان که فعال باشد حفظ می کند. البته برنامه نویس می تواند آن را از بین ببرد یا برای آن زمان انقضا تعریف بکند.

Session.Abandon(); سیشن جاری را لغو می کند.

Session.Timeout=30; مقدار سیشن جاری را بعد از 30 دقیقه به null تبدیل می کند. Timeout می تواند بین 1 تا 525600  (یک سال) بگیرد.

اگر در هنگام ایجاد به آن مقدار ندهیم و یا اگر زمان انقضا آن تمام شده باشد و یا اگر آن را لغو کرده باشیم، مقدار آن null خواهد شد. پس برای بررسی مقدار آن باید آن را با null مقایسه کنیم.

if (Session["name"] != null){

        عملیات مورد نظر

}

مثال:

private void function1()

    {

        ArrayList a = new ArrayList();

        a.Add(20);

        a.Add("Sanandaj");

        a.Add(3.14);

        Session["arrayList"] = a;

    }

    private void function2()

    {

        ArrayList b = (ArrayList)Session["arrayList"];

        Console.WriteLine(b[0].ToString());

        Console.WriteLine(b[1].ToString());

        Console.WriteLine(b[2].ToString());

    }

حالا می خواهیم پارامترهای پویا ارسال کنیم. یعنی با یه سیشن هر چند تا که می خواهیم مقدار مختلف ارسال کنیم. این روش در طراحی صفحات پویا کاملا موثر است.

برای این کار به دو صفحه احتیاج داریم به نام Page1 و  Page2 . می خواهیم چند تا لینک ایجاد کنیم که هر کدوم کد خاصی داشته باشند، و با کلیک بر هر کدام به صفحه بعدی رفته و بر اساس آن کد کار خاصی انجام بدهند. برای این کار به یک DropDownList احتیاج داریم که حاوی اعداد یک تا ده باشد. و همچنین به یک شی Panel که لینک ها دا در آن بچینیم.

 

protected void Page1 (object sender, EventArgs e)

    {

        for (int i = 0; i < DropDownList1.Items.Count; i++)

        {

            HyperLink Hp = new HyperLink();

            Hp.Text = DropDownList1.Items[i].Text;

            Hp.NavigateUrl = "~\\GetImage.aspx?HpLink=" + DropDownList1.Items[i].Text;

            Panel1.Controls.Add(Hp);

        }   

    }

 

protected void Page2 (object sender, EventArgs e)

    {

       Console.Write(Request.QueryString["HpLink"]);

    }

 

مشاهده می کنید در صفحه اول در قسمت لینک از علامت سوال؟ و بعد از آن از یک متغیر که نیازی به تعریف قبلی نداشت استفاده کردیم و سپس علامت مساوی قرار دادیم. نتیجه به این صورت خواهد بود که ده لینک با نامهای یک تا ده در پانل قرار می گیرد و با کلیک بر روی هر کدام شماره اش به صفحه دوم ارسال می شود.

در صفحه دوم نیز به کمک دستور ذکر شده می توان مقدار لینک ارسالی را که در متغیر کپی شده بود را گرفته و استفاده بکنیم.

در حالت کاربردی می توانیم اطلاعات مورد نظر را از بانک خوانده و مقدار کلید اصلی آن را به متغیر اختصاص بدهیم، و در صفحه دوم به کمک دستورات بانک اطلاعاتی مقدار کلید اصلی را به بانک ارسال کنیم و اطلاعات کاملتری از بانک گرفته و نمایش دهیم.

 

+ نوشته شده در  چهارشنبه پنجم خرداد 1389ساعت 13:57  توسط عارف دوستکامی  | 

نحوه ایجاد کانکشن استرینگ

سی شارپ نیز مانند اکثر زبانهای برنامه نویسی دیگر برای اتصال به بانک های اطلاعاتی نیاز به ابزاری به نام کانکشن (Connection) دارد. این ابزار نیز ویژگی های خاص خود را دارد که مهمترین آن شاید کانکشن استرینگ (Connection String) باشد که در زیر اجزای آن را توضیح می دهیم.

در کل دو روش ساخت کانکشن استرینگ وجود دارد که هرکدام بنا به کاربرد مزایای خاص خود را دارد.

روش اول استفاده از فایل پیکره بندی web.config است که اطلاعات کانکشن استرینگ داخل آن نوشته و هر بار برای استفاده آن را فراخوانی می کنیم.

نحوه نوشتن کانکشن استرینگ در فایل web.config

        connectionString=" Integrated Security=SSPI; database=MyDataBase; server=(local);"

     providerName="System.Data.SqlClient"

نحوه فراخوانی کانکشن استرینگ در کد برنامه

using System;

using System.Configuration;

         ConnectionStringSettings settings;

        settings = ConfigurationManager.ConnectionStrings["DatabaseConnection"];

        if (settings != null)

        {

            Console.WriteLine(settings.ConnectionString);

        }

تشریح اجزا:

Integrated Security : مایکرسافت برای امنیت بیشتر در استفاده سیستم عامل های مختلف از صفحات وب، از یک واسط مهیا کننده امنیتی Security Support Provider Interface (SSPI) استفاده می کند. البته اگر مقدار این فیلد را true بدهیم به این معنی است که برای ورود به بانک از سیستم عامل مجوز بگیرد و اگر مقدار آن false باشد یعنی برای ورود بایداز بانک اطلاعاتی مجوز بگیریم که اگر access باشد باید رمزی که به فایل اختصاص دادیم را بنویسیم و اگر sql باشد باید نام کاربری و رمز عبوری که در قسمت users تعریف شده است را بنویسیم. که باید از واژه های نام کاربری uid و رمز عبور pwd استفاده کرد.

Database: در این قسمت نام بانک اطلاعاتی خود را می نویسیم و اگر فایل access بود مسیر نسبی آن را می نویسیم.

Server: نام سرور را مشخص می کند. البته در زمانی که مشغول نوشتن و طراحی برنامه یا صفحه وب هستیم باید مقدار آن را (local) بدهیم تا روی سیستم ما قابل اجرا باشد، و پس از تکمیل برای اینکه در شبکه یا در اینترنت استفاده کنیم باید نام سرور یا ip سرور را بنویسیم.

روش دوم

نحوه نوشتن کانکشن استرینگ در کد برنامه.

using System.Data.SqlClient;

SqlConnection Connection = new SqlConnection("server=localhost;Integrated Security=False;Initial Catalog= MyDataBase;user=sa,password=123456");

 برای فراخوانی فقط کافی است که از نام Connection استفاده کنیم.

نکته: اگر قصد استفاده از روش دوم را دارید می توانید کانکشن استرینگ را در یک فایل خاص قرار دهید و از آن فایل به عنوان کرک برنامه استفاده کنید.

 

+ نوشته شده در  سه شنبه چهارم خرداد 1389ساعت 14:42  توسط عارف دوستکامی  | 

نحوه ارسال ایمیل

فضای نام(name space)

System.Web.Mail;

اشیا لازم

Objects

Names

TextBox

fromAddress

TextBox

sendToAddress

TextBox

messageSubject

TextBox

messageBody

TextBox

fileNameToAttach

TextBox

SMTPServerName

Label

statusLabel

 

ارسال ایمیل به صورت کامل (در صورتی که کل مقادیر داده شود).

MailMessage myMail = new MailMessage();

myMail.From= fromAddress.Text;

myMail.To=sendToAddress.Text;

myMail.Subject=messageSubject.Text;

myMail.Body=messageBody.Text;

SmtpMail.SmtpServer=SMTPServerName.Text;

SmtpMail.Send (myMail);

statusLabel.Text = "Mail has been sent";

 ارسال ایمیل در صورتی که نخواهیم از شی MailMessage استفاده کنیم.

string from = fromAddress.Text;

string to = sendToAddress.Text;

string subject = messageSubject.Text;

string body = messageBody.Text;

SmtpMail.SmtpServer=SMTPServerName.Text;

SmtpMail.Send(from, to, subject, body);

statusLabel.Text = "Mail has been sent";

 ارسال ایمیل در صورتی که با فایل همراه باشد

MailMessage mailWithAttachment = new MailMessage();

MailAttachment myAttachment = new MailAttachment(fileNameToAttach.Text);

mailWithAttachment.Attachments.Add(myAttachment);

mailWithAttachment.From=fromAddress.Text;

mailWithAttachment.To=sendToAddress.Text;

mailWithAttachment.Body=messageBody.Text;

mailWithAttachment.Subject=messageSubject.Text;

SmtpMail.SmtpServer=SMTPServerName.Text;

SmtpMail.Send(mailWithAttachment);

StatusLabel.Text = "Mail has been sent";

توضیحات:

1-     SMTPServerName  نام سروری است که می خواهیم براش ایمیل ارسال کنیم. به عنوان مثال اگر ایمیل خروجی abc@gmail.com  باشد در آن صورت مقدار این فیلد باید smtp.googlemail.com باشد. اطلاعات سرور اس ام تی پی را می توانید از ارائه دهندگان ایمیل دریافت کنید.

2-     به جای استفاده از کادر متنی fileNameToAttach برای نام فایل می توانید از شی فایل آپلود استفاده کنید، و خاصیت نام آن را مورد استفاده قرار دهید.

MailAttachment myAttachment = new MailAttachment(FileUpload.FileName);

 

+ نوشته شده در  دوشنبه سوم خرداد 1389ساعت 10:24  توسط عارف دوستکامی  |