星期一, 6月 30, 2014

[C#] 移除 Arrary 中的重覆值

MVA Twenty C# Questions Explained - [​18 How do I remove duplicates from an array?]
  • LINQ 範例:
用擴充方法 DISTINCT() 來移除重覆值,最後再利用 ToArary() 轉回 Arrary
int[] arr = new int[] { 1, 2, 2, 3, 3, 3, 4, 4, 4, 4 };
int[] result = arr.Distinct().ToArray();
  • List 範例
建立一個 List,掃原本的 Arrary,該資料假如不在 List 中,就把它加進去
int[] arr = new int[] { 1, 2, 2, 3, 3, 3, 4, 4, 4, 4 };

List<int> resultList = new List<int>();

foreach (int Data in arr)
{
    if (!resultList.Contains(Data))
    {
        resultList.Add(Data);
    }
}

int[] result = resultList.ToArray();
課程中也有介紹說不要去對 Arrary 進行移除的動作,直接利用 LINQ 來移除、產生新 Arrary 並取代才是最有效率的作法

星期一, 6月 23, 2014

[VS] 定位順序

使用者輸入時,每一個控件內資料輸入結束後,會習慣利用鍵盤 Tab 鍵來跳到下一個控件,來繼續資料輸入,一個 Form 內有很多控件時,亂跳的 Tab 會讓使用者抓狂的,因此控件順序是很重要

在 VS 中可以在 檢視 => 定位順序(Tab Order) 中來指定

[VS] 定位順序-1

Winform Layout 工具列

[VS] 定位順序-4

使用定位順序後,控件上會出現,藍色背景的順序標示,0為起始值

[VS] 定位順序-2

用滑鼠依序點選你要的順序,點選過後的控鍵,順序標示背景會變成白色

[VS] 定位順序-3

並不是全部控件都必須點選,只要按 Esc 鍵就算是完成

星期三, 6月 18, 2014

[C#] CurrencyManager

在公司內 VFP 系統內,都會有個自訂控制項,來作到第一筆、上一筆、下一筆和最後一筆,資料跳躍的功能,在 C# 中則是可以利用 CurrencyManager Class 來作到
CurrencyManager cm;
DataTable dt = new DataTable("CurrencyManagerDemo");

private void Form1_Load(object sender, EventArgs e)
{
    DBinit();
}

private void DBinit()
{
    dt = dtFill();
    cm = BindingContext[dt] as CurrencyManager;
    cm.PositionChanged += cm_PositionChanged;
    cm_EnableControl();
    txtPosition.Text = cm_PositionMessage();

    // DataBinding
    grdData.DataSource = dt;
    txtData.DataBindings.Add("Text", dt, "ID");
}

public DataTable dtFill()
{
    // 建立基本測試資料
    DataTable dt = new DataTable();
    dt.Columns.Add("ID", typeof(int));
    for (int i = 0; i < 5; i++)
    {
        dt.Rows.Add(i);
    }

    if (dt.PrimaryKey.Length == 0) dt.Constraints.Add("PK", dt.Columns["ID"], true);

    return dt;
}

#region CurrencyManager 相關
void cm_PositionChanged(object sender, EventArgs e)
{
    txtPosition.Text = cm_PositionMessage();
    cm_EnableControl(); 
}

private void btnFirst_Click(object sender, EventArgs e)
{
    cm.Position = 0;
}

private void btnPre_Click(object sender, EventArgs e)
{
    if (cm.Position > 0) cm.Position--;
}

private void btnNext_Click(object sender, EventArgs e)
{
    if (cm.Position < cm.Count - 1) cm.Position++;
}

private void btnLast_Click(object sender, EventArgs e)
{
    cm.Position = cm.Count - 1;
}

private void cm_EnableControl()
{
    btnFirst.Enabled = (cm.Position > 0);
    btnPre.Enabled = (cm.Position > 0);
    btnNext.Enabled = (cm.Position < cm.Count - 1);
    btnLast.Enabled = (cm.Position < cm.Count - 1);
}

private string cm_PositionMessage()
{
    return String.Format("{0} / {1}", (cm.Position + 1).ToString(), cm.Count);
}
#endregion

[ADO] CurrencyManager

CurrencyManager 為 dotNet 1.0 的功能,在 dotNet 2.0 用 BindingSource 搭配 BingingNavgatoe 來取代它,作出來後才發現這個殘酷事實,Orz ~~

星期一, 6月 16, 2014

[C#] 字串中特定字串出現次數

MVA Twenty C# Questions Explained - [6 How would you count the occurrences of a string within a string?]
  • 利用長度判斷
處理邏輯可以參考這篇文章 [SQL] 字串中特定字串出現次數,只是換成 C# 撰寫
namespace StringCount
{
    class Program
    {
        static void Main(string[] args)
        {
            string strData = "Hello, how are youyou you you you, you you yy?";
            string goal = "you";
            string strReplace = strData.Replace(goal, "");
            int times = (strData.Length - strReplace.Length) / goal.Length ;
            string message = string.Format("字串 {0} 在字串 {1} 中,出現 {2} 次", goal, strData, times);
            Console.WriteLine(message);
        }
    }
}

[C#] 字串中特定字串出現次數-1

星期一, 6月 09, 2014

[C#] Function 回傳多值

在 MVA Twenty C# Questions Explained - [20 - How Can I Return Multiple Values From a Function in C Sharp] 中,直覺是利用 out 參數就可以作到,在課程中還有介紹利用 Stucts 來作到,是自己沒有想到的,在這裡作個記錄

out 範例:搜尋員工個人資料
using System.Data.SqlClient;

namespace WindowsFormsApplication1
{
    public partial class frmReturnMultiValue : Form
    {

        DataTable dt = new DataTable();

        private void frmReturnMultiValue_Load(object sender, EventArgs e)
        {
            dt.Columns.Add("EmpNO", typeof(int));
            dt.Columns.Add("EmpName", typeof(string));
            dt.Columns.Add("Birthday", typeof(DateTime));
            dt.Rows.Add(1, "張三", new DateTime(1981, 12, 1));
            dt.Rows.Add(2, "李四", new DateTime(1980, 1, 9));
            dt.Rows.Add(3, "王五", new DateTime(2014, 5, 5));

            if (dt.PrimaryKey.Length == 0) dt.Constraints.Add("PK", dt.Columns["EmpNO"], true);
        }

        public Boolean FuncOut(int EmpNO, out string EmpName, out DateTime? Birthday)
        {

            DataRow dr = dt.Rows.Find(EmpNO);
            if (dr != null)
            {
                EmpName = dr["EmpName"].ToString();
                Birthday = DateTime.Parse(dr["Birthday"].ToString());
                return true;
            }
            else
            {
                EmpName = string.Empty;
                Birthday = null;
                return false;
            }
        }

        private void btnOut_Click(object sender, EventArgs e)
        {
            int EmpNO = 0;
            if (!int.TryParse(txtEmpNO.Text, out EmpNO) || EmpNO < 0) return;

            string EmpName = string.Empty;
            DateTime? Birthday = null;
            if (FuncOut(EmpNO,out EmpName , out Birthday))
            {
                lblMessage.Text = string.Format(string.Format("員工姓名:{0}、生日:{1:D}", EmpName, Birthday));
            }
            else
            {
                lblMessage.Text = "沒有該員工編號";
            }
        }
    }
}
[C#] Function 回傳多值-1

星期一, 6月 02, 2014

[C#] 物件導向 - 繼承

MVA 課程 Programming in C# Jump Start 中的範例,用自己的想法改寫並紀錄,下面範例兩大重點
  1. 物件導向繼承概念
  2. 利用 as 和 強制轉換(鑄型)的差異