2019年12月18日 星期三

在TEXTBOX按ENTER後直接執行按鈕事件

在OnKeyDown事件下寫入

            if(e.KeyCode == Keys.Enter)
            {
                button1.Focus();
                button1_Click(sender, e);
                textBox1.Focus();
            }

最後一行是把當前狀態回到textBox1的狀態,要保持在button1的狀態也是可以就不要寫那行

2019年12月15日 星期日

MYSQL建立一個帳號並允許本機外部連線的方式

先打開Mysql的Command Line
登入root密碼

1.新增使用者

CREATE USER 'username'@'%' IDENTIFIED BY 'password';

username是新建的帳號
password是這個帳號的密碼
%是可以從任意IP登入,也可以改成192.168.%.%之類的

2.查詢使用者

SELECT USER, host from mysql.user;

3.刪除使用者

DROP USER 'username' @ '%';

4.修改使用者權限

GRANT ALL ON *.* TO 'username'@'%';

這是把資料庫下所有表單的權限都開給username這個使用者
要限制表單或資料庫就把*.*改成表單或資料庫的名稱

5.處理完要把系統權限更新

FLUSH PRIVILEGES;

用C#連結MYSQL做操作

安裝好MYSQL套件後
using MySql.Data.MySqlClient;

要先登入MYSQL,為了讓未來如果要修改簡單點,所以設變數

            string dbHost = "192.168.0.1";//資料庫位址
            string dbUser = "userName";//資料庫使用者帳號
            string dbPass = "Password";//資料庫使用者密碼
            string dbName; //資料庫名稱
            String cmdText; //要輸入的指令

            string connStr = "server=" + dbHost + ";uid=" + dbUser + ";pwd=" + dbPass + ";database=" + dbName;
            MySqlConnection conn = new MySqlConnection(connStr);
            conn.Open();


利用MYSQL確認登入帳號密碼

先在MYSQL建立一組帳號密碼表單,欄位只有ID和PASSWORD

            userName = textBox1.Text.ToString();
            passWord = textBox2.Text.ToString();

            cmdText = "SELECT COUNT(*) FROM account WHERE ID = '" + userName + "' AND Password = '" + passWord + "'";
            MySqlCommand cmd = new MySqlCommand(cmdText, conn);

            int count = Convert.ToInt32(cmd.ExecuteScalar());

            if (count == 1)
            {
                  //帳號密碼成功要做的事情
            }
            else
            {
                MessageBox.Show("帳號或密碼錯誤!");
            }

利用計算符合筆數去做確定有沒有符合的帳號密碼組
因為只輸入一組帳密,所以出來的結果最多只有一組,不會超過兩組的結果(ID唯一)

應該會有更簡單的查詢方式不過我暫時只想到這種就先這樣

2019年12月11日 星期三

建立新的FORM更改起始FORM的方法

假如我要新增介面設計了FORM2,卻不想使用FORM1當程式的起始要使用FORM2

則是打開Program.cs

            Application.Run(new Form1());

Form1改成Form2或是其他要當起始Form的

2019年12月8日 星期日

將EXCEL內的資料貼上Datagridview物件的方法

private void PasteClipboard(DataGridView Datagridview)
        {
            try
            {
                string clipboardText = Clipboard.GetText();
                string[] lines = clipboardText.Split('\n');

                int RowIndex = Datagridview.CurrentCell.RowIndex;
                int ColIndex = Datagridview.CurrentCell.ColumnIndex;
                int RowCount = Datagridview.Rows.Count;

                DataGridViewCell CurrentCell;
                if (lines.Length > RowCount - RowIndex)
                {
                    int cut = lines.Length - (RowCount - RowIndex);
                    Datagridview.Rows.Add(cut);
                }

                foreach (string line in lines)
                {
                    string[] cells = line.Split('\t');
                    for (int i = 0; i < cells.Length; i++)
                    {
                        CurrentCell = Datagridview[ColIndex + i, RowIndex];
                        string value = cells[i];
                        CurrentCell.Value = value;
                    }
                    RowIndex++;
                }
            }
            catch
            {
                MessageBox.Show("Error");
                return;
            }

參考別人的,找出\n分行和\t分段去做切割再將資料貼在格子上

2019年12月4日 星期三

執行後將視窗最小化的方法

                    WindowState = FormWindowState.Minimized;

呼叫其他程式的方法

先using System.Diagnostics;

建立字串fileName,將程式路徑放入fileName中
路徑的\要改成\\
例如:D:\logs要改成D:\\logs

如果是同一層的另一個資料夾下則可以用相對路徑的方式
例如:同層的logs可以寫作 .\\logs

            Process.Start(fileName);

直接不帶參數呼叫程式

2019年12月3日 星期二

TextBox禁止輸入中文的方法

1.TextBox中的ImeMode設成Disable禁止切換成中文輸入

2.TextBox中的ShortcutsEnabled設成false禁止右鍵貼上

3.OnKeyDown事件中寫入

            if(e.Control && e.KeyCode == Keys.V)    //禁止貼上中文
            {
                e.Handled = true;
            }

禁止用鍵盤快捷CTRL+V貼上的方式貼上資料

寫一個LOGS檔案

固定放在D:\\logs下
要先
using System.IO

        private static void writeLog(string logText)
        {
            DateTime Date = DateTime.Now;
            string todayAllStat = Date.ToString("yyyy-MM-dd HH:mm:ss");
            string todayYMD = Date.ToString("yyyyMMdd");

            if(!Directory.Exists("D:\\logs"))
            {
                Directory.CreateDirectory("D:\\logs");
            }

            File.AppendAllText("D:\\logs\\" + todayYMD + ".txt", "\r\n" + todayAllStat + " -- " + logText);
        }

檔名用年月日8位數字表示
資訊開頭先記錄詳細時間,後面再記錄發生的狀況
程式要用的時候再呼叫就好

2019年11月26日 星期二

調整Picturebox圖片的透明度

先建立Picturebox1和Picturebox2和滑桿物件Trackbox1           
為了不破壞原圖達成順利調整透明度,才建立第2個(不顯示),方便作業
透明度為-255 ~ +255

           Bitmap BMP = new Bitmap(pictureBox2.Image);
            int brightness = trackBar1.Value;       //抓滑桿的值

            for(int y = 0; y < BMP.Height; y++)
            {
                for(int x = 0; x < BMP.Width; x++)
                {
                    var pixel = BMP.GetPixel(x, y);         //取得圖片的pixel資訊

                    var pixelR = ((pixel.R + brightness > 255) ? 255 : (pixel.R + brightness)) < 0 ? 0 : ((pixel.R + brightness > 255) ? 255 : (pixel.R + brightness));
                    var pixelG = ((pixel.G + brightness > 255) ? 255 : (pixel.G + brightness)) < 0 ? 0 : ((pixel.G + brightness > 255) ? 255 : (pixel.G + brightness));
                    var pixelB = ((pixel.B + brightness > 255) ? 255 : (pixel.B + brightness)) < 0 ? 0 : ((pixel.B + brightness > 255) ? 255 : (pixel.B + brightness));

                    Color newColor = Color.FromArgb(pixel.A, pixelR, pixelG, pixelB);   //把這個pixel的修改後資訊寫回
                    BMP.SetPixel(x, y, newColor);
                }
            }

            pictureBox1.Image = BMP;

先建立個bitmap物件處理,抓取pixel資訊將RGB資訊計算出來
若超過255則設為255,若低於0則設為0
再把計算結果放到picturebox1

設定一個先存入原圖避免每次picturebox1的圖每次更動每次都被破壞數值,暫存使用

var隱含型別

以前上課沒學過的部分

var是宣告變數的型態但不給確定的型態
真正給值的話編譯器才會給他型態
比起直接宣告成int, string之類的會更方便和自由

FileDialog設定Filter

Filter屬性

只需要圖片的話可以填成
               
                 Image Files (*.bmp; *.jpg)|*.bmp;*.jpg

若是分類加上所有檔案的話可以寫成

                 Image Files (*.bmp; *.jpg)|*.bmp;*.jpg|Text Files (*.txt)|*.txt |All Files |*.*

前面是顯示描述,後面是檔名表示,多個檔名則用分號分開
中間不要用空格分隔會跑掉!

2019年11月24日 星期日

利用OpenFileDialog讀取圖片

先拉OpenFileDialog和Picturebox物件

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string str = openFileDialog1.FileName;
                pictureBox1.Image = Image.FromFile(str);
            }

先跳出檔案對話盒,如果有選取就執行,取消就不執行
先宣告字串str把檔案名字存進去
再把pictureBox1的Image放入你選取的檔案

◎調整成符合視窗大小

屬性中的SizeMode改成StretchImage

抓取滑鼠所在座標

使用Form的OnMouseMove事件

            int x, y;
            x = e.Location.X;
            y = e.Location.Y;

抓取滑鼠的XY座標
再自行用輸出方式顯示(Label、TextBox、toolStripStatusLabel等)

計算小數點

將TrackBar的數值轉成小數點

            double change = Math.Round((double)trackBar1.Value / 100,2);

先宣告double型態(或其他小數點型態)
因為兩個整數型態相除不會顯示小數點,所以得強制把其中一邊轉換成非int
避免小數點位數太多所以利用Math.Round設定位數,2則只顯示到小數點後面第二位


colorDialog物件

拉調色盤物件colorDialog
呼叫調色盤物件並將顏色傳回:

            if (colorDialog1.ShowDialog() != DialogResult.Cancel)
            {
                BackColor = colorDialog1.Color;
            }



DateTimePicker物件相關

比較不熟這物件,備忘用

◎抓取年月日

dateTimePicker1.Value.Year
dateTimePicker1.Value.Month
dateTimePicker1.Value.Day

◎增加年月日數

dateTimePicker1.Value.AddYears(int);
dateTimePicker1.Value.AddMonths(int);
dateTimePicker1.Value.AddDays(int);

其他想到再加


儲存狀態 & 顏色

◎儲存特定某些變數供程式關閉後下次開啟使用的方法
※以更改儲存背景顏色為例:

尋找要儲存的變數
背景顏色的話則是BackColor
先到母物件Form1底下的ApplicationSettings→PropertyBinding選擇要更改的BackColor
按右邊的箭號,新增,定義名稱為BKColor,可先設定現行顏色

顏色做好變更後再補上一行把這顏色定義存檔供下次開啟載入使用:

            Properties.Settings.Default.Save();

這樣就會把儲存設定存起來了

◎顏色預設
C#的底色預設值為系統→Control
用程式碼控制則為

            Color.FromKnownColor(KnownColor.Control);


尋找兩個日期的間隔

◎直接套用C#的函式,計算兩個日期差(只能計算純天數)

            TimeSpan span = dateTimePicker2.Value - dateTimePicker1.Value;
            int diffDays = Convert.ToInt32(span.Days);

※宣告TimeSpan形式來計算兩者的天數差,取日期則用dateTimePicker物件抓值
如果想抓今天的日期則可以使用

            DateTime.Now;

除了抓今天日期外還可以抓到現在是幾點幾分幾秒(因為C#只有DateTime沒有DATE)


日期格式相關

◎改變日期顯示方式
由於C#只有DATETIME型態,有時候不想顯示分秒只想顯示年月日的時候
列印時可以修改輸出格式

例如:
            DateTime DT1;
            TextBox1.Text = DT1.ToString(yyyy/MM/dd);

※MM要大寫,mm是分鐘這樣會錯誤

◎輸出使用民國年顯示
            var datetime1 = new DateTime(year, month, day);
            var taiwanCalender = new System.Globalization.TaiwanCalendar();
            var datetime2 = string.Format("民國 {0}年 {1}月 {2}日",taiwanCalender.GetYear(datetime1),datetime1.Month,datetime1.Day);

※宣告一個datetime1,輸入年月日資訊
※宣告taiwanCalender,呼叫民國曆格式
※宣告datetime2輸出民國曆格式用,string.Format重新宣告格式,只改民國年,使用此法可以避免直接-1911年出現的少數錯誤bug(直接取年-1911也可以,但不能直接用AddYear(-1911))

呼叫新的form,傳值

◎建立一個新的Form2視窗

新建立的Form的屬性設定:
禁止最大化:MaximizeBox→False
禁止最小化:MinimizeBox→False
禁止調整大小:FormBorderStyle→FixSingle

在Form1中觸發呼叫事件,先建立一個新的Form2物件再做呼叫:

            Form2 transparency1 = new Form2();
            transparency1.ShowDialog();

※transparency1為新設定的物件名稱
※不用ShowDialog改用Show也可以

◎Form1傳值給Form2使用
※Form1內

            Form2 F2 = new Form2();
            F2.Owner = this;     //Form2的指標指向Form1
            F2.TextBox1.Text = "傳值到F2";
            F2.ShowDialog();

◎Form2傳值給Form1使用
※Form1內

            Form2 F2 = new Form2();
            F2.Owner = this;     //Form2的指標指向Form1
            F2.ShowDialog();

※Form2內

            Form1 F1 = (Form1)this.Owner;       //把Form2的父窗口指標給Form1

            F1.Opacity = change;
            this.Close();


關閉視窗

◎只關閉新開的視窗:

            this.Close();

◎要把整個程式關閉:

            this.Close();
            Environment.Exit(Environment.ExitCode);
            InitializeComponent();


開發環境

採用環境:
Visual Studio 2019 (C# Winform)
Mysql 8.0 (配合Workbench 8.0)


基本上紀錄一下程式寫法備忘用
盡可能寫成比較簡單好理解的方式
有的可能比較基本
有的可能會用比較笨的寫法