Monthly Archives: August 2013

Combo Box – Cách thêm dữ liệu vào ComboBox trong C#

Sử dụng KeyValuePair sẽ có một key và một value sau đó có thể add vào trong chương trình một cách dễ dàng.

var items = new BindingList<KeyValuePair<string, string>>();

items.Add(new KeyValuePair<string, string>(“N”, “Nợ”));
items.Add(new KeyValuePair<string, string>(“C”, “Có”));

cmbNoCo.DataSource = items;
cmbNoCo.ValueMember = “Key”;
cmbNoCo.DisplayMember = “Value”;

=> Thế là có phần lựa chọn dành cho Combobox

Sprite Kit – Công cụ phát triển game mới của Apple (IOS 7)

Sự ra đời của IOS 7 với rất nhiều chức năng mới trong số đó một bộ công cụ Kit mới ra đời đã đem lại một hướng mới cho các nhà phát triển game. Đó chính là Sprite Kit, bộ công cụ mới giúp phát triển game.

Những lập trình viên đã tham gia phát triển game cho IOS đều đã biết qua Cocos2d một trong những bộ công cụ giúp việc làm game trở nên dễ dàng hơn. Với Cocos2d, các lập trình viên có thể dễ dàng tạo ra game từ thư viện chung của chương trình. Cộng đồng lớn giúp cho Cocos2d có thể phát triển tốt. Tuy nhiên, Cocos2d vẫn là một chương trình của hãng thứ 3. Nó không hề tương thích hoàn toàn với IOS mà cần phải nâng cấp liên tục để tạo ra sự tương thích với các version của IOS.

Nay với Sprite Kit, mọi việc đã hoàn toàn khác. Đây là bộ công cụ được phát hành chính thức bởi Apple. Mọi thứ trong bộ công cụ này đều tương thích với các bộ công cụ khác của Apple. Trong đó chúng ta có thể kết hợp Sprite Kit với UIKit để làm ra những game đơn giản. Mặt khác, các engine vật lý cũng đã được tích hợp sẵn trong Sprite Kit giúp cho việc tương tác vật lý khá là dễ dàng. Việc cần làm chỉ là tạo ma trận tương tác và xác định điều kiện tương tác giữa các đối tượng với trong chương trình.

Apple đã đưa ra 2 hướng dẫn cần thiết cho những lập trình viên chính thức.

– Tài liệu hướng dẫn những gì có trong bộ công cụ này

– Hướng dẫn chi tiết hình thành một game với đầy đủ tính năng sử dụng bộ Sprite Kit này.

* Đây là link down 2 tài liệu này về để nghiên cứu:

– Mediafire:

– Fshare:

* Tôi đang nghiên cứu bộ công cụ này và sẽ có hướng dẫn nhanh chóng cho các bạn để phát triển game theo bộ công cụ mới này của Apple.

(Hiện tại, công cụ này chưa được phổ biến cho tất cả mọi lập trình viên mà chỉ có những lập trình viên chính thức, đã đóng tiền cho Apple mới được tiếp cận với IOS 7 và Xcode 5 trong đó có tui :D)

Lập trình viên hoàn hảo

Ngày nay, lập trình viên đã được chính thức xem là một nghề kỹ thuật cao. Những lập trình viên là những người có thể tạo ra các phần mềm giúp rút ngắn thời gian làm việc của mọi người xuống và có tính chính xác cao hơn.

Tuy nhiên, câu hỏi đặt ra là thế nào là một lập trình viên hoàn hảo?

Lập trình viên hoàn hảo là lập trình viên đạt được các yếu tố sau:

1. Chuyên về ít nhất một ngôn ngữ lập trình:

– Các ngôn ngữ lập trình hiện nay có rất nhiều, mỗi ngôn ngữ lại có những ứng dụng riêng cho từng lĩnh vực khác nhau. Tuy nhiên, chúng ta phải hiểu rằng, một ngôn ngữ cũng có thể làm được tất cả những chức năng mà ngôn ngữ khác có thể đem lại chỉ khác là khó khăn hơn hoặc chậm chạp hơn một chút mà thôi.

– Nắm vững trong tay một ngôn ngữ lập trình là bạn đã có thể làm được mọi việc.

– Ngoài ra, một ngôn ngữ sẽ có điểm giống 80 % với các ngôn ngữ lập trình khác về cấu trúc, design pattern và cách sử dụng IDE để phát triển nó. Tuy nó vẫn có một số những điểm khác nhau nhưng vẫn có thể học và sử dụng một cách nhanh chóng những ngôn ngữ khác.

2. Kỹ năng phát triển phần mềm cá nhân:

– Một phần mềm được phát triển không chỉ có phần viết code mà còn cần rất nhiều những kỹ thuật khác:

+ Kỹ năng phân tích, nhận xét vấn đề

+ Kỹ năng thiết kế phần mềm.

+ Quản lý cơ sở dữ liệu

– Những kỹ năng này khi phát triển cao nhất sẽ tạo thành những ngành khác chứ không còn là một lập trình viên nữa. Điển hình như khâu thiết kế phần mềm, khi học chuyên sâu sẽ trở thành những nhà thiết kế chứ không phải là đơn thuần là một lập trình viên.

3. Bạn cần nắm vững một mô hình phát triển phần mềm:

– Mô hình phát triển phần mềm chính là quy trình để bạn có thể phát triển và bảo trì phần mềm đó. Hiện tại có rất nhiều mô hình phát triển phần mềm, trong đó mô hình thác nước (Waterfall) đang từ từ lộ ra các nhược điểm trong khi mô hình lập trình linh hoạt lại chứng tỏ được sự hữu dụng và tiếp tục phát triển.

– Chọn lựa một mô hình phát triển phần mềm sẽ giúp cho bạn có khả năng phát triển phần mềm nhanh chóng và ít lỗi hơn nhiều. Mô hình gần đây đang được phát triển khá là tốt đó là lập trình linh hoạt (Agile Programming). Mô hình này đang được hỗ trợ bởi rất nhiều quy trình nằm trong nó đế bảo đảm rằng mô hình này hoạt động tốt, đây là những thứ mà lập trình viên cần phải nắm rõ để tuân theo quy trình.

4. Sự đam mê với lập trình:

– Cái này có thể nhiều người không xem trong nhưng sự đam mê chính là một trong những nhân tố giúp cho bạn có thể tiếp thu những kỹ thuật mới, những phương pháp mới làm cho chương trình chạy nhanh hơn nhiều chức năng hơn.

– Bạn nên nhớ rằng sau khi bạn lập trình 3-5 năm mọi thứ về lập trình bạn có thể làm được mọi thứ nếu bạn thực sự làm việc và lúc đó những thứ bạn đơn thuần chỉ lặp lại những quá trình mà bạn đã làm thành một thói quen.

– Ngoài ra, nếu không có sự đam mê với lập trình bạn sẽ rất mau nản, không có hứng thú với những công nghệ mới và không tự hoàn chỉnh chính mình. Bạn sẽ chỉ hoàn tất những công nghệ cách đây 10 năm với WinXP trong khi mọi người đang sử dụng Window 7 thế thì bạn sẽ chẳng thể viết một chương trình hữu ích thật sự cho thế giới.

– Trên các diễn đàn, có rất nhiều những lập trình viên rên rĩ về việc lập trình quá nhàm chán và không có sự đổi mới. Đó là sai lầm của những thợ lập trình. Một chương trình mà chỉ lập trình đi lập trình lại thì một lập trình viên giỏi có thể để cho code hoàn toàn xử lý việc đó. Như vậy việc bạn viết code lâu chỉ là do bạn quá lười để làm thêm những kỹ thuật giúp cho việc code nhanh mà thôi.

– Ở đây chúng ta có thể kể đến những phương pháp lập trình mới như:

+ Lập trình động (Dynamic programming)

+ Ánh xạ (Reflection)

+ Entity Framework Code First

Shallow Copy và Deep Copy trong C #

* Có 2 khái niệm khi nhân bản một đối tượng trong lập trình.

– Shallow Copy (Sao lưu ngoài) sẽ nhân bản chỉ cấu trúc của đối tượng chứ không tạo ra một bản sao khác trong chương trình.

– Trong khi đó Deep Copy (Sao lưu) sẽ nhân bản không chỉ cấu trúc mà mọi thứ trong đối tượng đó thành một đối tượng hoàn toàn mới.

* Ví dụ: Khi chúng ta có một tập hợp A  gồm các phần tử {a, b, c, …}

– Shallow Copy sang một tập hợp B sẽ tạo thành một tập hợp cùng chứa các phần từ {a, b, c}. Điều đó có nghĩa là nếu bạn xóa phần tử a trong tập hợp A thì ở phần tử B cũng chỉ còn {b, c} do nó cùng chứa tại một vị trí trong bộ nhớ chứ không phải tạo một bản sao hoàn chỉnh của các phần tử bên trong của tập hợp.

– Deep Copy thì lại hoàn toàn ngược lại. Tập hợp B sẽ chứa tất cả các đối tượng {a, b, c} nhưng nó là một thực thể độc lập so với tập hợp A. Điều đó cũng có nghĩa là nếu bạn xóa đi phần từ bên tập hợp A thì trong tập hợp B vẫn không có gì thay đổi.

* Với việc nhân bản (Copy) một đối tượng trong C# thường chúng ta sẽ dùng 2 phương thức sau để có thể nhân bản một cách dễ dàng:

/// <summary>
/// Sử dụng để nhân bản một đối tượng trong lập trình
/// Trường hợp là Entity Object sẽ không tính Entity Key
/// </summary>
/// <typeparam name=”T”> Loại của đối tượng cần sử lý</typeparam>
/// <param name=”other”>Đối tượng cần nhân bản</param>
/// <returns></returns>
public static T LKCopy<T>(this T other)
{
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, other);
ms.Position = 0;

dynamic result = (T)formatter.Deserialize(ms);
try
{
if (result is EntityObject)
{
result.EntityKey = null;
}
}
catch { }

return result;
}
}

=> Ở đây có thêm một phần kiểm tra xem đây có phải là một Entity Object hay không dùng để gán giá trị null cho EntityKey vì nếu để EntityKey cũng được nhân bản thì thực tế bạn đang làm việc trên một Object duy nhất của chương trình.

* Lưu ý: Cách còn lại sử dụng Dynamic sẽ được đưa lên sau nếu có ai quan tâm đến vấn đề này

Hashtable trong C#

I. HashTable là gì?

HashTable là một kiểu dữ liệu danh sách dùng để lưu dữ liệu theo một từ khóa và giá trị của nó.

 

– Muốn sử dụng được HashTable bạn cần phải khai báo Thư viện Collection.

Với HashTabel, dữ liệu luôn đi kèm một cặp [Key  – Value].

– Về cơ bản, HashTable có tính năng tương tự như Dictionary. Tuy nhiên với Dictionary ta cần phải khai báo kiểu dữ liệu cho Key và Value còn HashTable thì không cần thiết.

 

Với HashTable, ta có thể thêm dữ liệu thông qua Key và lấy dữ liệu thông qua Key một cách dễ dàng hơn rất nhiều nếu dùng các kiểu dữ liệu khác.

 

II. Cách sử dụng:

 

Cần phải thêm thư viện vào chương trình trước:

 

using System.Collections;

 

Đây là phần tạo và thêm những phần tử vào trong HashTable:

 

var hashTable = new Hashtable();

 

           hashTable.Add(“lapKan”, “Website tham khảo lập trình”);

           hashTable.Add(“Author”, “Huygamer”);

           hashTable.Add(“HoTen”, “Nguyễn Ngọc Huy”);

 

           String lk = “lapKan của Author”;

           foreach (DictionaryEntry item in hashTable)

           {

               lk = lk.Replace(item.Key.ToString(), item.Value.ToString());

           }

 

Ta sẽ có kết quả là:

 

Website tham khảo lập trình của Huygamer

 

III. Các thuộc tính của HashTable:

 

1. Truy xuất một phần từ bất kỳ trong HashTable thông qua từ khóa (Key);

txtThongBao.Text = hashTable[“HoTen”].ToString();

 

2. Xóa một phần tử trong HashTable:

HashTable.Remove(“HoTen”);

 

3. Kiểm tra phần tử trong HashTable thông qua ContainsKey và ContainsValue:

hashTable.ContainsKey(“HoTen”);

hashTable.ContainsValue(“lapKan”);

 

4. Kiểm tra số lượng và làm mới HashTable:

– Chúng ta có thể kiểm tra số lượng phần tử trong danh sách thông qua hàm Count.

txtThongBao.Text = “Số lượng phần tử: ” + hashTable.Count.ToString();

 

– Chúng ta cũng có thể xóa sạch HashTable bằng hàm Clear():

hashTable.Clear();

5. Tạo ra một phiên bản của HashTable thông qua ham Clone();

var cloneHashTable = hashTable.Clone();

 

=> Tuy nhiên cần phải lưu ý cloneHashTable không phải là một HashTable mà là một object và object này không thể sử dụng được. Ứng dụng của nó là bạn có thể sử dụng nó như một bản lưu trữ mà không phải truy vấn ngược lại hashTable trước đó.

var cloneHashTable = hashTabel.Clone();

hashTable.Remove(“HoTen”);

hashTable.Clear();

hashTable = (HashTable)cloneHashTable;

 

Bạn sẽ có lại một HashTable như ban đầu mà không cần phải khởi tạo lại hay moi dữ liệu từ database. Đây là một tính năng khá hay của các danh sách (Collection).

* Lưu ý: Bạn clone là bạn tạo bản sao của HashTable chứ không phải là nội dung bên trong nó.

Cách gọi Segues trong IOS với dữ liệu

* Khi sử dụng StoryBoard trong lập trình IOS có nhiều lúc ta cần phải lấy dữ liệu từ một viewController A sang một viewController B.

– Việc chuyển từ ViewController A sang ViewController B bằng StoryBoard cực kỳ dễ dàng, tuy nhiên việc chuyển dữ liệu thì không có nhiều người biết đến.

* Nhắc lại: Muốn chuyển từ viewController A sang viewController B ta dùng giữ Ctrl (Control) kéo từ ViewController A sang ViewController B. Như vậy controller (Điểm bắt đầu trỏ vào Button hay View) sẽ có một kết nối tới ViewController B. Khi đó chỉ cần được kích hoạt ViewController B sẽ được gọi mà không cần phải viết một dòng code nào trong chương trình.

* Tuy nhiên khi cần phải chuyển một dữ liệu từ ViewController A sang ViewController B thì chúng ta cần phải viết code trong câu lệnh:

– (void) prepareForSegue : (UIStoryboardSegue *) segues sender: (id) sender{

}

* Có nhiều cách để có thể chuyển dữ liệu. Tuy vậy, hầu hết số đó cần quan tâm đến destinationViewController (View đích) gây khó khăn cho việc chỉnh lại code.

* Ở đây các bạn có thể dùng dòng code @selector này để chuyển dữ liệu mà không cần quan tâm đến view đích là gì. Khi ViewController đích không có selector này thì segue sẽ không cần truyền biến sang. Như vậy các bạn có thể sử dụng một Object chung để lưu trữ những hàm này và tái sử dụng trên những viewController khác nhau để thúc đầy thời gian lập trình nhanh hơn nữa.

* Đầu tiên ở ViewController đích sẽ có thuộc tính cần truyền sang:

@property (assign, atomic) NSString * lkString;

* Đây là viewController nguồn có Segues  function:

– (void) prepareForSegue: (UIStoryboardSegue *) segue sender:(id) sender

{

if ([segue.destinationViewController respondsToSelector:@selector(setLkString:)]) {

[segue.destinationViewController performSelector:@selector(setLkString:) withObject:lkStringSource];

}

}

=> Đây là câu lệnh cho phép kiểm tra xem ViewController đích có selector setLkString hay không trước khi nó gọi selector này nên câu lệnh là tuyệt đối an toàn và có thể sử dụng chung cho rất nhiều view trong cùng một chương trình.

Sửa lỗi của DataGridView trong C#

“Operation is not valid due to the current state of the object.”

=> Đây là một trong những lỗi khá là khó chịu của C# khi sử dụng Visual Studio 2010.

Lỗi này xuất hiện khi DataSource Binding và DataGridView có sự chêch lệch record giữa số lượng record trong BindingList và số lượng record trong DataGridView do một lỗi của Microsoft nên số lượng record trong DataGridView it hơn 1 so với trong DataBinding.

* Muốn sửa lỗi ta cần phải thêm một handler 

     lkDataSource.AddingNew += new AddingNewEventHandler(lkDataSource_AddingNew);

* Và so sánh như sau:

(Có thể các bạn sẽ không hiểu vì sao ở đây là DataGridView count bằng với Databinding count, đơn giản vì BindingList Count lớn hơn 1 so với DataGridView count nhưng nó lại chứa thêm một record rỗng để người sử dụng nhập vào nên nó vừa trừ 1 để bằng lại vừa cộng 1 vì hơn 1 record adding nên rút cuộc phép so sánh sẽ thnàh như thế này)

void lkDataSource_AddingNew(object sender, AddingNewEventArgs e)
{
if (dgv_list.Rows.Count == lkDataSource.Count)
{
lkDataSource.RemoveAt(lkDataSource.Count – 1);
return;
}
}