برخی از تاپیکهای مهم و پربازدید در تالار سی شارپ
دوستان لطفا از طریق پیامهای شخصی من رو در تکمیل این بخش یاری کنید :این لیست به مرور تکمیلتر (و نیز دسته بندی) خواهد شد
حاشیه دار کردن کنترل TextBox با یک رنگ دلخواه
در کلاس TextBox خود (و یا سایر کنترلهای دلخواه : کامبوباکس، لیست باکس و ...) بنویسید :
private static int WM_NCPAINT = 0x0085;
private static int WM_ERASEBKGND = 0x0014;
private static int WM_PAINT = 0x000F;
[DllImport("user32.dll")]
static extern IntPtr GetDCEx(IntPtr hwnd, IntPtr hrgnclip, uint fdwOptions);
[DllImport("user32.dll")]
static extern int ReleaseDC(IntPtr hwnd, IntPtr hDC);
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_NCPAINT || m.Msg == WM_ERASEBKGND || m.Msg == WM_PAINT)
{
IntPtr hdc = GetDCEx(m.HWnd, (IntPtr)1, 1 | 0x0020);
if (hdc != IntPtr.Zero)
{
Graphics graphics = Graphics.FromHdc(hdc);
Color borderColor = Color.Blue;
Rectangle rectangle = new Rectangle(0, 0, this.Width, this.Height);
ControlPaint.DrawBorder(graphics, rectangle, borderColor, ButtonBorderStyle.Solid);
m.Result = (IntPtr)1;
ReleaseDC(m.HWnd, hdc);
}
}
}
توجه داشته باشید که انجام اینکار صرفا بوسیله override کردن رویداد paint و رسم یک مستطیل امکانپذیر نیست.
محو شدن تدریجی یک فرم با تغییر دادن خاصیت Opacity
private void button1_Click(object sender, EventArgs e)
{
this.Opacity = 1;
for (int i = 0; i < 100; i++)
{
this.Opacity -= 0.01;
Application.DoEvents();
}
}
this به آبجکت فعلی از فرم اشاره دارد.
انتقال آیتمهای یک آرایه از اعداد به یک لیست باکس
int[] numbers = { 12, 23, 34, 45, 56, 67 };
Object[] oNumbers = new Object[numbers.Length];
numbers.CopyTo(oNumbers, 0);
listBox1.Items.AddRange(oNumbers);
پیاده سازی حالت ساده ی الگوی سینگلتون در یک کلاس
sealed class SingletonClass
{
// Static members are lazily initialized.
// .NET guarantees thread safety for static initialization
private static readonly SingletonClass instance =
new SingletonClass();
// Note: constructor is private.
private SingletonClass(){}
public static SingletonClass GetInstance()
{
return instance;
}
}
منبع : http://www.dofactory.com/Patterns/PatternSingleton.aspx
رسم یک چندضلعی توپر روی یک فرم
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
// Create pen.
Pen blackPen = new Pen(Color.Black, 3);
// Create points that define polygon.
Point point1 = new Point(30, 50);
Point point2 = new Point(100, 25);
Point point3 = new Point(200, 5);
Point point4 = new Point(250, 50);
Point point5 = new Point(270, 100);
Point point6 = new Point(250, 250);
Point[] curvePoints = {point1, point2, point3, point4, point5, point6};
// Draw polygon to screen.
g.DrawPolygon(blackPen, curvePoints);
// Fill polygon
g.FillPolygon(Brushes.Red, curvePoints);
}
کشیدن نقاشی با توابع ساده گرافیکی و ذخیره خروجی در یک فایل
public void Draw2File ()
{
Bitmap bmp = new Bitmap (500, 400);
Graphics gr = Graphics.FromImage (bmp);
Rectangle rect = new Rectangle (20, 20, 450, 350);
gr.DrawRectangle (Pens.Red, rect);
gr.FillRectangle(Brushes.Pink, rect);
gr.DrawString ("Salam", new Font ("Arial", 10), Brushes.Red, 50, 50);
gr.DrawArc (Pens.Red, 30, 30, 60, 60, 0, 180);
gr.DrawEllipse(new Pen(Color.Yellow, 3), new Rectangle(200, 100, 200, 200));
bmp.Save ("C:\\1.bmp");
bmp.Dispose ();
gr.Dispose ();
}
بدست آوردن لیست نمونه های SQL Server موجود در شبکه
using System.Data.Sql;
private void ShowSQLServerInstances()
{
SqlDataSourceEnumerator instance = SqlDataSourceEnumerator.Instance;
System.Data.DataTable table = instance.GetDataSources();
dataGridView1.DataSource = (table);
}
افزودن و حذف کردن یک برنامه به StartUp ویندوز از طریق کلیدهای رجیستری
using Microsoft.Win32;
private void AddStartUpKey(string _name, string _path)
{
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\Micros oft\Windows\CurrentVersion\Run", true);
key.SetValue(_name, _path);
}
private void RemoveStartUpKey(string _name)
{
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\Micros oft\Windows\CurrentVersion\Run", true);
key.DeleteValue(_name, false);
}
Hibernate و Standby کردن کامپیوتر
// Hibernate
Application.SetSuspendState(PowerState.Hibernate, true, true);
// Standby
Application.SetSuspendState(PowerState.Suspend, true, true);
قفل کردن کامپیوتر از طریق کدنویسی
[DllImport("user32.dll")]
public static extern void LockWorkStation()
// Lock workstation
LockWorkStation();
شفاف کردن پشت زمینه ی کنترلها
ایجاد شفافیت کامل پشت زمینه ی یک کنترل :
control.BackColor = Color.Transparent;
تعیین میزان شفافیت یک کنترل:
control.BackColor = Color.FromArgb(trancparency, control.BackColor);
در کد بالا مقدار trancparency از 0 (برای کاملا شفاف) تا 255 (کاملا کدر) قابل تغییر است.
مثال : یک Label با شفافیت 50%
label1.BackColor = Color.FromArgb(127, label1.BackColor);
Shutdown، Restart و Logoff کردن یک کامپیوتر بوسیله کد
[DllImport("user32.dll")]
public static extern int ExitWindowsEx(int uFlags, int dwReason);
// Log Off
ExitWindowsEx(0, 0);
// Reboot
ExitWindowsEx(2, 0);
// Shutdown
ExitWindowsEx(1, 0);
// Force LogOff
ExitWindowsEx(4, 0);
و یا:
// Log Off
System.Diagnostics.Process.Start("ShutDown", "/l");
// Reboot
System.Diagnostics.Process.Start("ShutDown", "/r");
// Shutdown
System.Diagnostics.Process.Start("ShutDown", "/s");
بستن یک پروسه در حال اجرا
مثال : بستن notepad
using System.Diagnostics;
foreach (Process p in Process.GetProcesses())
{
if (p.ProcessName.ToLower() == "notepad")
p.Kill();
}
و یا :
System.Diagnostics.Process.Start("TaskKill", "/f /im Notepad.exe /t");
Ping کردن یک کامپیوتر تحت شبکه
using System.Net.NetworkInformation;
private void button2_Click(object sender, EventArgs e)
{
string remoteMachineNameOrIP = "127.0.0.1";
int timeOut = 5;
Ping ping = new Ping();
// Pinging remote maching
PingReply reply = ping.Send(remoteMachineNameOrIP, timeOut);
// Displaying the result
StringBuilder sb = new StringBuilder();
sb.Append("Address:" + reply.Address.ToString());
sb.Append("\nStatus:" + reply.Status.ToString());
sb.Append("\nRoundtripTime:" + reply.RoundtripTime.ToString());
MessageBox.Show(sb.ToString(), "Ping Result: " + remoteMachineNameOrIP);
}
منبع : http://www.dotnetspider.com/code/C-245-Ping-remote-computer-network.aspx
بدست آوردن مسیر دایرکتوری جاری برنامه
MessageBox.Show(AppDomain.CurrentDomain.BaseDirect ory);
یا :
MessageBox.Show(System.IO.Directory.GetCurrentDire ctory());
یا :
MessageBox.Show(Application.StartupPath);
یا:
MessageBox.Show(System.IO.Path.GetDirectoryName(Ap plication.ExecutablePath));
برگرداندن تعدادی مشخص و اتفاقی از رکوردها بوسیله کوئری
مثال : برگرداندن 10 رکورد تصادفی از جدول myTable
SELECT TOP 10 id,title
FROM myTable
ORDER BY NEWID()
پاک کردن خاصیت Text گروهی از کنترلهای مشخص
کاربرد : زمانی که نمیتوان از یک الگوریتم بازگشتی استفاده کرد؛ برای مثال کنترلها در Container های متفاوتی هستند و تنها تعداد خاصی از آنها باید Clear شوند.
public void ClearControls(params Control[] ctls)
{
foreach (Control ct in ctls)
ct.Text = "";
}
private void button1_Click(object sender, EventArgs e)
{
ClearControls(textBox1, textBox2, comboBox1);
}
عوض کردن نشانگر ماوس (cursor) روی یک کنترل
استفاده از کرسرهای پیشفرض محیط :
button1.Cursor = Cursors.Hand;
لود کردن یک کرسر سفارشی از فایل :
button1.Cursor = new Cursor(@"C:\WINDOWS\Cursors\hibeam.cur");
پاک کردن خاصیت Text کنترلهای موجود در یک Container بصورت بازگشتی
public void ClearControls(Control _parent)
{
if (!_parent.HasChildren)
_parent.Text = "";
foreach (Control ct in _parent.Controls)
ClearControls(ct);
}
private void button1_Click(object sender, EventArgs e)
{
ClearControls(this);
}
بدست آوردن آخرین Identity اضافه شده به جدول
INSERT INTO Sales.Customer ([TerritoryID],[CustomerType]) VALUES (8,'S')
GO
SELECT SCOPE_IDENTITY()
ساختن یک Connection با استفاده از ConnectionString موجود در فایل Configuration
برای خواندن ConnectionString ی که در فایل app.config قرار داده شده کافیه و ایجاد یک SqlConnection کافیه کد زیر را تایپ کنین:
SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrin gs["myConnection"].ConnectionString);
Encrypt کردن ConnectionString ها موجود در فایل app.Config
برای Encrypt کردن قسمت ConnectionStrings فایل web.config یا app.Config از کد زیر استفاده می کنیم:
App.Config
Configuration config = ConfigurationManager.OpenExeConfiguration(Configur ationUserLevel.None);
config.ConnectionStrings.SectionInformation.ForceS ave = true;
config.ConnectionStrings.SectionInformation.Protec tSection("RsaProtectedConfigurationProvider");
config.Save();
Web.Config
Configuration config = WebConfigurationManager.OpenWebConfiguration("myWe bSite");
config.ConnectionStrings.SectionInformation.ForceS ave = true;
config.ConnectionStrings.SectionInformation.Protec tSection("RsaProtectedConfigurationProvider");
config.Save();
Decrypt کردن ConnectionString ها موجود در فایل app.Config
برای Decrypt کردن محتویات ConnectionString داخل فایل های Config از کد های زیر استفاده می کنیم:
برای App.Config
Configuration config = ConfigurationManager.OpenExeConfiguration(Configur ationUserLevel.None);
config.ConnectionStrings.SectionInformation.ForceS ave = true;
config.ConnectionStrings.SectionInformation.Unprot ectSection();
config.Save();
برای Web.Config
Configuration config = WebConfigurationManager.OpenWebConfiguration("myWe bSite");
config.ConnectionStrings.SectionInformation.ForceS ave = true;
config.ConnectionStrings.SectionInformation.Unprot ectSection();
config.Save();
معرفی چند snippet متداول جهت سرعت بخشیدن به کدنویسی
آشنایی با Snippet ها باعث سرعت شما در محیط کدنویسی میشود. برای استفاده کافیست بلافاصله بعد از نوشتن آنها (و بدون ایجاد فاصله) دوبار دکمه Tab را فشار دهید. (توضیحات بیشتر)
در ادامه با چند اسنیپت متداول آشنا خواهید شد :
ایجاد یک ناحیه : #region
ایجاد MessageBox :
mbox
ایجاد Constructor برای کلاس :
ctor
ایجاد متود Main :
svm
برای ایجاد کلاسها، ایندکسر، استراکچر، ... class, enum, struct, indexer
برای ایجاد انواع حلقه ها :for
forr
foreach
while
do
ایجاد پراپرتی :prop
propg
دستورات شرطی :if
else
switch
و ...
روش دیگر افزودن : روی یک قسمت خالی در محیط کدنویسی Right Click و سپس گزینه Insert Snippet رو انتخاب نمایید.
چنانچه کدی (مثلا 10 خط) نوشتید که میخواهید درون یک بلاک (حلقه، شرط و ...) قرار بگیره تمامی خطوط آن را Select و پس از Right Click گزینه Surround with رو انتخاب نمایید.
در لینک زیر نیز ضمن آشنایی با سایر موارد میتوانید snippet های مفید دیگری را نیز دانلود و به IDE خود بیفزایید.
لیست کامل سایر snippetها : http://msdn2.microsoft.com/en-us/vs2005/aa718338.aspx
ایجاد فرمهایی با اشکال غیرمستطیلی
ایجاد یک فرم دایره ای شکل :
private void Form1_Load(object sender, EventArgs e)
{
this.Height = 350;
this.Width = 350;
//Creating circle path
System.Drawing.Drawing2D.GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath();
path.AddEllipse(0, 0, 300, 300);
//Creating the region from the circle path
this.Region = new Region(path);
this.Show();
}
منبع : http://www.dotnetspider.com/code/C-144-Create-Circle-shaped-Form-using-Regions.aspx
قطع کردن اتصال اینترنت دایل آپ از طریق دستورات خط فرمان
System.Diagnostics.Process.Start("rasdial", "/disconnect");
تغییر زبان پیشفرض ویندوز بصورت داینامیک در برنامه
public struct LanguageHelper
{
public static void SetLanguage2English()
{
InputLanguage.CurrentInputLanguage = InputLanguage.FromCulture(new CultureInfo("en-US"));
}
public static void SetLanguage2Farsi()
{
InputLanguage.CurrentInputLanguage = InputLanguage.FromCulture(new CultureInfo("fa-IR"));
}
}
ایجاد طیف رنگ (Gradient) بعنوان پشت زمینه ی کنترلها
using System.Drawing.Drawing2D;
using System.Drawing;
public void PaintGradient(Control _control, LinearGradientMode _direction, Color _gradientColorStart, Color _gradientColorEnd)
{
LinearGradientBrush gradBrush;
gradBrush = new LinearGradientBrush(new Rectangle(0, 0, _control.Width, _control.Height), _gradientColorStart, _gradientColorEnd, _direction);
Bitmap bmp = new Bitmap(_control.Width, _control.Height);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(gradBrush, new Rectangle(0, 0, _control.Width, _control.Height));
_control.BackgroundImage = bmp;
_control.BackgroundImageLayout = ImageLayout.Stretch;
}
حال این متود رو در رخداد Paint کنترلهای دلخواه (فرم، دکمه، پنل ...) بنویسید :
private void Form1_Paint(object sender, PaintEventArgs e)
{
PaintGradient(this, LinearGradientMode.Vertical, Color.RoyalBlue, Color.DarkBlue);
}
خصوصا ظاهر بهتر و مناسبتری برای دکمه های شما ایجاد میکند.
چگونه از یک فرم تنها یک عدد بتواند باز شود ؟ (توسط Generic Singleton)
با استفاده از پیاده سازی ژنریک الگوی سینگلتون :
public class SingletonProvider<T> where T : new()
{
SingletonProvider() { }
public static T Instance
{
get
{
return SingletonCreator.Instance;
}
}
class SingletonCreator
{
static SingletonCreator(){}
private static T instance;
public static T Instance
{
get
{
System.Windows.Forms.Form frm = instance as System.Windows.Forms.Form;
if (instance == null || frm.IsDisposed==true)
instance = new T();
return instance;
}
}
}
}
و برای استفاده : BoatForm boat = SingletonProvider<BoatForm>.Instance;
آموزش کامل این روش : https://barnamenevis.org/showthread.php?t=90581
طریقه تغییر دادن خاصیت FontStyle یک کنترل در زمان اجرا
private void Form1_Load(object sender, EventArgs e)
{
textBox1.Font = new Font(textBox1.Font, FontStyle.Bold | FontStyle.Italic | FontStyle.Underline);
}
1 ضمیمه
تغییر رنگها و شمای محیط کدنویسی ویژوال استادیو
گاهی بد نیست برای تنوع هم که شده ظاهر محیط کدنویسی رو از حالت یکنواخت و سفید همیشگی تغییر بدیم.
اینکار رو میتونید خودتون بسادگی انجام بدید و راحتتر از اون اینکه فایل تنظیمات رو از سایر سایتها (مانند سایت زیر ) دانلود و استفاده کنید:
http://idehotornot.ning.com
پس از دانلود فایل مورد نظر، جهت اعمال تغییرات در ویژوال استادیو مراحل زیر رو طی کنید :
نقل قول:
Tools(menu)->Import and Export settings->Import...
بدست آوردن مسیر فولدرهای ویژه
برای مثال : string path = Environment.GetFolderPath(Environment.SpecialFolde r.ProgramFiles);
سایر مسیرها قابل دستیابی با این روش :
Desktop, MyDocuments, System, ...
بنقل از : https://barnamenevis.org/showpost.php?p=468371&postcount=3
خواندن و نوشتن فایل به صورت unicode با استفاده از richTextBox
// read text file
richTextBox1.LoadFile(@"C:\Log.txt", RichTextBoxStreamType.UnicodePlainText);
// save text file
richTextBox1.SaveFile(@"C:\Log.txt", RichTextBoxStreamType.UnicodePlainText);
جابجا کردن فرم با کلیک بر روی هر قسمت از آن - با استفاده از توابع API
using System.Runtime.InteropServices;
[DllImport("user32.dll")]
static extern int ReleaseCapture();
[DllImport("user32.dll", EntryPoint = "SendMessageA")]
static extern int SendMessage(int hwnd, int wMsg, int wParam, object lParam);
private const int WM_NCLBUTTONDOWN = 161;
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
ReleaseCapture();
SendMessage(this.Handle.ToInt32(), WM_NCLBUTTONDOWN, 2, 0);
}