ویرایشگر متن

در این درس  می‌خواهیم طریقه ایجاد  یک ویرایشگر متن را که به شما اجازه قالب بندی متن ، ذخیره و باز کردن یک فایل موجود ، را می دهد، آموزش دهیم. این درس از کنترل‌های ToolStrip و RichTextBox به عنوان اجزای اصلی استفاده می‌کند . یک فرم را ایجاد کرده و نام آن را SimpleTextEditor بگذارید . یک کنترل ToolStip را از جعبه ی ابزار به فرم اضافه کنید . برای ایجاد آیتم های استاندارد بر روی فلش سمت راست کنترل ToolStrip کلیک کرده و گزینه Insert Standard Items را انتخاب می کنیم.
simple-text-editor-1001

بعد از انتخاب این گزینه آیتم ها ظاهر می شوند. حال آیتم هایی را که نیاز نداریم حذف می کنیم. دکمه های پرینت و کمک ((Help را حذف کنید . فرم شما چیزی شبیه این خواهد شد :
simple-text-editor-1002
یک جدا کننده به ToolStrip اضافه کرده و سه دکمه جدید ایجاد کنید. نام دکمه‌ها را boldToolStripButton ، italicToolStripButton و underlineToolStripButton بگذارید. به این دکمه ها سه آیکون که من لینک دانلود آنها را برای شما گذاشته ام ، اختصاص می دهید :

دانلود آیکون

می خواهیم از این دکمه ها برای ضخیم کردن، کج کردن و زیر خط دار کردن متون استفاده کنیم. بعد از تعیین عکس برای سه دکمه فرم شما به صورت زیر در می آید :
simple-text-editor-1003
اجازه دهید که یک آیتم دیگر به ToolStrip برای تعیین فونت اضافه کنیم. یک جدا کننده و کنترل ToolStripComboBox اضافه می کنیم. عرض فرم را طوری افزایش می دهیم که تمامی آیتم های اضافه شده در آن قرار بگیرند.
نام آیتم جدید را fontsToolStripComboBox می گذاریم. شکل نهایی فرم باید به صورت زیر باشد:
simple-text-editor-1004
برای تعیین اندازه فونت هم یک ToolStripComboBox اضافه کرده و نام آنرا به sizeToolStripComboBox تغییر می دهیم. اندازه آیتم جدید را کمی تغییر داده و کوچکتر می کنیم. برای این کار مقدار خاصیت AutoSize را برابر False قرار می دهیم. همچنین لازم است که مقدار خاصیت AutoSize کنترل ToolStrip را برابر False قرار می دهیم. و در آخر مقدار خاصیت Size را به 50 و 30 تغییر دهید تا اندازه آیتم جدید کوچکتر شود و با استفاده از خاصیت Items چندین اندازه به آن اضافه کنید (5,8,10,12,14,16,18,20,24,30,45,72). فرم نهایی باید به صورت زیر باشد :
simple-text-editor-1005
بعد از اتمام رابط کاربری به یک کنترل RichTextBox برای تایپ متن در آن نیاز دارید. یک کنترل RichTextBox را از toolbox بر روی فرم بکشید و خاصیت Dock ان را برابر Fill قرار داده و نام آن را به editorRichTextBox تغییر دهید. ظاهر نهایی برنامه باید به صورت زیر باشد:
simple-text-editor-1006

 

اضافه کردن دستورات به برنامه

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

private void newToolStripButton_Click(object sender, EventArgs e)
{
    editorRichTextBox.Clear();
}

کد بالا به سادگی تمام متون داخل RichTextBox را پاک می کند. دکمه بعدی به ما اجازه باز کردن یک فایل که از قبل موجود است را می دهد. ما کاربر را محدود به باز کردن فایل های متنی و RTF می کنیم. بر روی این دکمه دوبار کلیک کرده و کد زیر را در داخل کنترل کننده رویداد ان می نویسیم :

  1: private void openToolStripButton_Click(object sender, EventArgs e)
  2: {
  3:     OpenFileDialog openDialog = new OpenFileDialog();
  4:     openDialog.InitialDirectory = @"C:\";
  5:     openDialog.Multiselect = false;
  6:     openDialog.DefaultExt = "txt";
  7:     openDialog.Filter = "Text Files|*.txt|RTF|*.rtf";
  8: 
  9:     DialogResult result = openDialog.ShowDialog();
 10:             
 11:     if (result == DialogResult.OK)
 12:     {
 13:         string extension = System.IO.Path.GetExtension(openDialog.FileName);
 14: 
 15:         if (extension == ".txt")
 16:             editorRichTextBox.LoadFile(openDialog.FileName,
 17:                     RichTextBoxStreamType.PlainText);
 18:         else
 19:             editorRichTextBox.LoadFile(openDialog.FileName,
 20:                     RichTextBoxStreamType.RichText);
 21:     }
 22: }

وقتی که بر روی دکمه Open کلیک می کنید کادر محاوره ای OpenFileDialog نشان داده می شود. در خطوط 3-7 خصوصیات مربوط به این کادر محاوره ای را مقدار دهی می کنیم. در خط 7 با استفاده از خاصیت Filter مشخص می کنیم که کاربر فقط اجازه باز کردن فایل های متنی و RTF را دارد. در خط 9 و با استفاده از متد ShowDialog() کادر محاوره ای را باز می کنیم. کاربر فایل را انتخاب می کند. وقتی که کاربر بر روی دکمه Open کلیک می کند متد ShowDialog() یک نوع شمارشی (DialogResult.OK) را بر می گرداند. در خط 11 تست می کنیم که آیا دکمه OK انتخاب شده است یا نه که در صورت انتخاب، در خط 13 نام و پسوند فایل انتخاب شده را به متد System.IO.Path.GetExtention() ارسال می کنیم تا پسوند آن را تشخیص دهد. اگر پسوند متنی (txt) بود سپس نام فایل را به عنوان اولین پارامتر و RichTextBoxStreamType.RichText را که RichTextBox را مجاب می کند با فایل مانند یک فایل متنی رفتار کند به عنوان دومین پارامتر به متد LoadFile() ارسال می کنیم. به عبارت دیگر با استفاده از RichTextBoxStreamType.RichText به RichTextBox می گوییم که کدهای RTF داخل فایل متنی را پردازش کرده و بخواند. دکمه بعدی دکمه ذخیره سازی (Save) است که همانند دکمه Open عمل می کند با این تفاوت که از SaveDialog و متد SaveFile() استفاده می نماید.

private void saveToolStripButton_Click(object sender, EventArgs e)
{
    SaveFileDialog saveDialog = new SaveFileDialog();
    saveDialog.InitialDirectory = @"C:\";
    saveDialog.DefaultExt = "txt";
    saveDialog.Filter = "Text Files|*.txt|RTF|*.rtf";

    DialogResult result = saveDialog.ShowDialog();

    if (result == DialogResult.OK)
    {
        string extension = Path.GetExtension(saveDialog.FileName);

        if (extension == ".txt")
            editorRichTextBox.SaveFile(saveDialog.FileName, 
            RichTextBoxStreamType.PlainText); 
        else
            editorRichTextBox.SaveFile(saveDialog.FileName, 
            RichTextBoxStreamType.RichText); 
    }
}

دکمه های بعدی دکمه Cut، Copy و Paste هستند. بر روی تک تک آنها دوبار کلیک کرده و کدهای زیر را در داخل کنترل کننده های رویداده های مربوطه بنویسید :

private void cutToolStripButton_Click(object sender, EventArgs e)
{
    editorRichTextBox.Cut();
}

private void copyToolStripButton_Click(object sender, EventArgs e)
{
    editorRichTextBox.Copy();
}

private void pasteToolStripButton_Click(object sender, EventArgs e)
{
    editorRichTextBox.Paste();
}

همانطور که مشاهده می کنید به راحتی و با ساتفاده از متدهایی از قبل تعریف شده عملیات کپی و کات و … را انجام دادیم. دکمه بعدی به کاربر اجازه می دهد متن موجود را ضخیم (bold) کند. بر روی دکمه B دوبار کلیک کرده و کد زیر را در داخل آن بنویسید :

   1: private void boldToolStripButton_Click(object sender, EventArgs e)
   2: {
   3:     try
   4:     {
   5:         editorRichTextBox.SelectionFont = new Font(editorRichTextBox.SelectionFont,
   6:             editorRichTextBox.SelectionFont.Style ^ FontStyle.Bold);
   7:     }
   8:     catch
   9:     {
  10:         editorRichTextBox.SelectionFont = new Font(fontsToolStripComboBox.SelectedText,
  11:             Single.Parse(sizeToolStripComboBox.Text), FontStyle.Bold);
  12:     }
  13: }

به خطوط 5-6 توجه کنید. در این خطوط از خاصیت SelectionFont مربوط به کنترل RichTextBox برای قالب دهی به فونت استفاده کرده ایم. ما با استفاده از سازنده کلاس فونت تغییرات جدید را به فونت موردنظرمان اعمال می کنیم. اولین پارامتر فونت موجود و دومین پارامتر قالبی است که باید به فونت اعمال شود، می باشد. از عملگر XOR (^) برای اعمال یا حذف ضخامت به فونت استفاده می کنیم.
مشکلی که ممکن است با آن مواجه شویم زمانی است که بخواهیم متنی را که شامل چند فونت مختلف است را انتخاب کنیم. به عنوان مثال متن Hello World را انتخاب کنیم که کلمه Hello از فونت Times New Roman و کلمه World از فونت Arial استفاده کند. در نتیجه SelectionFont نمی داند که باید از کدام فونت استفاده کند و مقادیر را به آن اختصاص دهد. حال فرض کنید که خطا رخ داده است، اینجاست که ما به راحتی و در داخل بلوک try نوع هر دو فونت را برابر فونت تعیین شده در داخل ComboBox قرار می دهیم.
برای دکمه های Italic و Underline هم کاملا مانند بالا عمل می کنیم و فقط پارامترها را تغییر می دهیم :

private void italicToolStripButton_Click(object sender, EventArgs e)
{
    try
    {
        editorRichTextBox.SelectionFont = new Font(editorRichTextBox.SelectionFont,
            editorRichTextBox.SelectionFont.Style ^ FontStyle.Italic);
    }
    catch
    {
        editorRichTextBox.SelectionFont = new Font(fontsToolStripComboBox.SelectedText,
            Single.Parse(sizeToolStripComboBox.Text), FontStyle.Italic);
    }
}
private void underlineToolStripButton_Click(object sender, EventArgs e)
{
    try
    {
        editorRichTextBox.SelectionFont = new Font(editorRichTextBox.SelectionFont,
            editorRichTextBox.SelectionFont.Style ^ FontStyle.Underline);
    }
    catch
    {
        editorRichTextBox.SelectionFont = new Font(fontsToolStripComboBox.SelectedText,
            Single.Parse(sizeToolStripComboBox.Text), FontStyle.Underline);
    }
}

در مرحله بعد همه فونت ها ی موجود در سیستم را در کنترل ComboBox بارگذاری می کنیم. برای این کار بر روی فرم دوبار کلیک کرده و کدهای زیر را در کنترل کننده رویداد ان می نویسید :

private void Form1_Load(object sender, EventArgs e)
{
    System.Drawing.Text.InstalledFontCollection fonts =
            new System.Drawing.Text.InstalledFontCollection();

    foreach (FontFamily family in fonts.Families)
    {
        fontsToolStripComboBox.Items.Add(family.Name);
    }

    fontsToolStripComboBox.Text = editorRichTextBox.Font.FontFamily.Name;
    sizeToolStripComboBox.Text = editorRichTextBox.Font.Size.ToString();
}

کلاس InstalledFontCollection شامل مجموعه ای از همه فونت های موجود در سیستم است. ما با استفاده از یک حقله همه اشیاء فونت را در خاصیت Families این کلاس می ریزیم. و سپس نام فونت ها را نیز با استفاده از خاصیت Name آن به ComboBox اضافه می کنیم. دو خط آخر هم برای تعیین فونت پیشفرض و سایز آن، نوشته شده اند.
حال با یک مشکل مواجه می شویم. اگر متنی را انتخاب کنید و با استفاده از fontToolStripComboBox یا sizeToolStripComboBox بخواهید فونت یا سایز متن را عوض کنید از حالت انتخاب خارج می شوند. برای جلوگیری از این وضعیت ابتدا و انتهای رشته انتخاب شده را در دو متغیر ذخیره می کنیم تا هنگامی که کاربر از ویرایشگر خارج و دوباره وارد شد قسمت های انتخابی ، حالت انتخاب خود را از دست ندهند. برای این منظور دو فیلد Private را در کلاس Form1 تعریف می کنیم :

private int selectionStart = 0;
private int selectionLength = 0;

حال در رویداد Leave کنترل RichTextBox کد زیر را می نویسیم :

private void editorRichTextBox_Leave(object sender, EventArgs e)
{
    selectionStart = editorRichTextBox.SelectionStart;
    selectionLength = editorRichTextBox.SelectionLength;
}

این کد ابتدا و انتهای متن انتخاب شده را در دو متغیری که قبلا ایجاد کردیم ذخیره می کند. حال لازم است که یک کد را نیز به رویداد Enter کنترل RichTextBox اضافه کنیم. بر روی این رویداد دوبار کلیک کرده و کد زیر را در داخل آن می نویسیم. این کد را برای این اضافه می کنیم تا وقتی کاربر دوباره به ویرایشگر برگشت قسمت های انتخاب شده حالت انتخاب خود را حفظ کنند :

private void editorRichTextBox_Enter(object sender, EventArgs e)
{
    editorRichTextBox.Select(selectionStart, selectionLength);
}

حال برای اعمال فونت جدید بر روی متن انتخاب شده در محیط طراحی، کنترل fontToolStripComboBox را انتخاب و بر روی رویداد SelectedIndexChanged دوبار کلیک کنید و کد زیر را در داخل آن بنویسید :

private void fontsToolStripComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
    editorRichTextBox.Focus();

    try
    {
        editorRichTextBox.SelectionFont = new Font(
            fontsToolStripComboBox.SelectedItem.ToString(),
            editorRichTextBox.SelectionFont.Size, 
            editorRichTextBox.SelectionFont.Style);
    }
    catch
    {
        editorRichTextBox.SelectionFont = new Font(fontsToolStripComboBox.Text,
            Single.Parse(sizeToolStripComboBox.Text), FontStyle.Regular);
    }
}

به این نکته توجه کنید که با فراخوانی متد Focus()ابتدا متن داخل RichTextBox به حالت انتخاب در می آید و سپس فونت جدید با استفاده از سازنده Font به آن اعمال می شود. اولین پارامتر نوع فونتی است که قرار است به متن اعمال شود و از کنترل fontsToolStripComboBox انتخاب می شود. پارامتر دوم اندازه و قالب فونت را مشخص می کند. همانند دکمه های Bold، Italic و Underline اگر با خطایی مواجه شویم بلوک catch اجرا می شود و هر فونت و سایزی که در ComboBox های فونت و سایز هست اعمال می شوند.
حال بر روی sizeToolStripComboBox دو بار کلیک کرده و کدهای زیر را در کنترل کننده رویداد آن بنویسید :

private void sizeToolStripComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
    editorRichTextBox.Focus();

    try
    {
        editorRichTextBox.SelectionFont = new Font(
            editorRichTextBox.SelectionFont.FontFamily,
            Single.Parse(sizeToolStripComboBox.SelectedItem.ToString()),
            editorRichTextBox.SelectionFont.Style);
    }
    catch
    {
        editorRichTextBox.SelectionFont = new Font(fontsToolStripComboBox.Text,
            Single.Parse(sizeToolStripComboBox.Text), FontStyle.Regular);
    }
}

همانطور که در کد بالا مشاهده می کنید ساختار و متد Single.Parse() برای تبدیل مقدار اندازه وارد شده در sizeToolStripMenuComboBox به float به کار می رود.
برنامه را اجرا کرده و چند فایل متنی را باز کرده و دستکاری کنید. البته به یاد داشته باشید که یک ویرایشگر متن دارای قابلیت های بیشتری است که ما به چند تا از آنها اشاره کردیم.
simple-text-editor-1007

دانلود پروژه ویرایشگر متن

کل کد :

using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;

namespace SimpleTextEditor
{
    public partial class Form1 : Form
    {
        private int selectionStart = 0;
        private int selectionLength = 0;

        public Form1()
        {
            InitializeComponent();
        }

        private void newToolStripButton_Click(object sender, EventArgs e)
        {
            editorRichTextBox.Clear();
        }

        private void openToolStripButton_Click(object sender, EventArgs e)
        {
            OpenFileDialog openDialog = new OpenFileDialog();
            openDialog.InitialDirectory = @"C:\";
            openDialog.Multiselect = false;
            openDialog.DefaultExt = "txt";
            openDialog.Filter = "Text Files|*.txt|RTF|*.rtf";

            DialogResult result = openDialog.ShowDialog();
            
            if (result == DialogResult.OK)
            {
                string extension = Path.GetExtension(openDialog.FileName);

                if (extension == ".txt")
                    editorRichTextBox.LoadFile(openDialog.FileName, 
                        RichTextBoxStreamType.PlainText);
                else
                    editorRichTextBox.LoadFile(openDialog.FileName, 
                        RichTextBoxStreamType.RichText);
            }
        }

        private void saveToolStripButton_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveDialog = new SaveFileDialog();
            saveDialog.InitialDirectory = @"C:\";
            saveDialog.DefaultExt = "txt";
            saveDialog.Filter = "Text Files|*.txt|RTF|*.rtf";

            DialogResult result = saveDialog.ShowDialog();

            if (result == DialogResult.OK)
            {
                string extension = Path.GetExtension(saveDialog.FileName);

                if (extension == ".txt")
                    editorRichTextBox.SaveFile(saveDialog.FileName, 
                        RichTextBoxStreamType.PlainText);
                else
                    editorRichTextBox.SaveFile(saveDialog.FileName, 
                        RichTextBoxStreamType.RichText);
            }
        }

        private void cutToolStripButton_Click(object sender, EventArgs e)
        {
            editorRichTextBox.Cut();
        }

        private void copyToolStripButton_Click(object sender, EventArgs e)
        {
            editorRichTextBox.Copy();
        }

        private void pasteToolStripButton_Click(object sender, EventArgs e)
        {
            editorRichTextBox.Paste();
        }

        private void boldToolStripButton_Click(object sender, EventArgs e)
        {
            try
            {
                editorRichTextBox.SelectionFont = new Font(editorRichTextBox.SelectionFont,
                    editorRichTextBox.SelectionFont.Style ^ FontStyle.Bold);
            }
            catch
            {
                editorRichTextBox.SelectionFont = new Font(fontsToolStripComboBox.SelectedText,
                    Single.Parse(sizeToolStripComboBox.Text), FontStyle.Bold);
            }
        }

        private void italicToolStripButton_Click(object sender, EventArgs e)
        {
            try
            {
                editorRichTextBox.SelectionFont = new Font(editorRichTextBox.SelectionFont,
                    editorRichTextBox.SelectionFont.Style ^ FontStyle.Italic);
            }
            catch
            {
                editorRichTextBox.SelectionFont = new Font(fontsToolStripComboBox.SelectedText,
                    Single.Parse(sizeToolStripComboBox.Text), FontStyle.Italic);
            }
        }

        private void underlineToolStripButton_Click(object sender, EventArgs e)
        {
            try
            {
                editorRichTextBox.SelectionFont = new Font(editorRichTextBox.SelectionFont,
                    editorRichTextBox.SelectionFont.Style ^ FontStyle.Underline);
            }
            catch
            {
                editorRichTextBox.SelectionFont = new Font(fontsToolStripComboBox.SelectedText,
                    Single.Parse(sizeToolStripComboBox.Text), FontStyle.Underline);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            System.Drawing.Text.InstalledFontCollection fonts = new System.Drawing.Text.InstalledFontCollection();

            foreach (FontFamily family in fonts.Families)
            {
                fontsToolStripComboBox.Items.Add(family.Name);
            }

            fontsToolStripComboBox.Text = editorRichTextBox.Font.FontFamily.Name;
            sizeToolStripComboBox.Text = editorRichTextBox.Font.Size.ToString();
        }

        private void editorRichTextBox_Leave(object sender, EventArgs e)
        {
            selectionStart = editorRichTextBox.SelectionStart;
            selectionLength = editorRichTextBox.SelectionLength;
        }

        private void editorRichTextBox_Enter(object sender, EventArgs e)
        {
            editorRichTextBox.Select(selectionStart, selectionLength);
        }

        private void fontsToolStripComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            editorRichTextBox.Focus();

            try
            {
                editorRichTextBox.SelectionFont = new Font(
                    fontsToolStripComboBox.SelectedItem.ToString(),
                    editorRichTextBox.SelectionFont.Size, 
                    editorRichTextBox.SelectionFont.Style);
            }
            catch
            {
                editorRichTextBox.SelectionFont = new Font(fontsToolStripComboBox.Text,
                    Single.Parse(sizeToolStripComboBox.Text), FontStyle.Regular);
            }
        }

        private void sizeToolStripComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            editorRichTextBox.Focus();
            try
            {
                editorRichTextBox.SelectionFont = new Font(
                    editorRichTextBox.SelectionFont.FontFamily,
                    Single.Parse(sizeToolStripComboBox.SelectedItem.ToString()),
                    editorRichTextBox.SelectionFont.Style);
            }
            catch
            {
                editorRichTextBox.SelectionFont = new Font(fontsToolStripComboBox.Text,
                    Single.Parse(sizeToolStripComboBox.Text), FontStyle.Regular);
            }
        }
    }
}

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

  1. roya پاسخ دادن

    سلام آیا این مطالب و پروژه های جدید در کتاب سی شارپتون موجود هستند؟

    • یونس ابراهیمی پاسخ دادن

      نه،اول مهر اضافشون میکنم.

  2. mysun پاسخ دادن

    توی کلاس form1 خود برنامه از قبل اینو تعریف کرده :

    private int selectionLangth;

    بعدشم به این خط مشکل میگیره :

    string extension = System.IO.Path.GetExtension(opendialog.FileNames);

    چرا؟
    اینم خطا:

    The best overloaded method match for 'System.IO.Path.GetExtension(string)' has some invalid arguments	
    C:\Users\Amoon\documents\visual studio 2010\Projects\sampletexteditor\sampletexteditor\Form1.cs\	sampletexteditor
    
  3. یونس ابراهیمی پاسخ دادن

    سلام دوست عزیز…آخر همین پست پروژه رو واسه دانلود گذاشتم…چک کنید که ایراد کار کجاست.

  4. سیاوش پاسخ دادن

    در جواب دوستمون mysun :

    به جای FileNames باید بنویسی FileName !

    opendialog.FileName

    • یونس ابراهیمی پاسخ دادن

      ممنون از راهنماییتون

  5. mysun پاسخ دادن

    ممنون از دوستان گرامی

  6. محمد حسین غفاری پاسخ دادن

    سلام هقا.یه پروژه ی مدیریت دانشگاه برای دانلود میزارید

  7. صابر اسدی گچساران پاسخ دادن

    سلامن مهندس ابراهیمی حالت چطوره..مرسی از وب سایت خوبت..اگه میشه پروژه بانک اطلاعاتی رو باآموزش بزار

    • یونس ابراهیمی پاسخ دادن

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

  8. saeed پاسخ دادن

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

  9. یونس ابراهیمی پاسخ دادن

    سلام دوست عزیز، ممنون از لطفتون، فرض کن یه دکمه روی فرم داری و توی رویداد کلیکش یه چیزی نوشتی واسه اینی که شما می فرمایید باید توی رویداد Deactivate فرمتون اینجوری بنویسید :

    private void button1_Click(object sender, EventArgs e)
    {
        MessageBox.Show("Button was Clicked!");
    }
    
    private void Form1_Deactivate(object sender, EventArgs e)
    {
        button1_Click(sender,e);
    }
  10. mh پاسخ دادن

    با سلام
    از شما بابت مطالب مفیدتان تشکر می کنم.
    آیا ممکن است متن داخل rtb را به فرمت pdf در sql ذخیره کرد؟
    ممکنه در این مورد توضیح دهید؟
    تشکر می کنم.