Năm 2010 là thời điểm mà Microsoft sẽ công bố hàng loạt các sản phẩm công nghệ mới. Trong đó phải kết đến như Microsoft Office 2010, SharePoint 2010 và đặc biệt là bộ công cụ phát triển cho các lập trình viên, Visual Studio 2010. Đi kèm với Visual Studio 2010 là nền tảng phát triển mới .NET 4.0 mạnh mẽ. NET 4.0 hứa hẹn sẽ mở ra một cuộc cách mạng trong phát triển ứng dựng dựa trên nền tảng Microsoft. Nó thúc đẩy quá trình phát triển phần mềm, trở nên linh hoạt hơn và nhanh chóng hơn.
Lập trình động (Dynamic programming)
Có thể nói nét chủ đạo trong .NET 4.0 đó là lập trình động (dynamic programming). Các đối tượng (object) ngày nay trở nên động (dynamic) theo ý nghĩa là cấu trúc và hành vi của nó không bị bó buộc bởi kiểu dữ liệu tĩnh (static) như trước đó, đồng thời trình biên dịch không cần biết kiểu dữ liệu của đối tượng trong quá trình biên dịch chương trình. Điều này sẽ rất có ích khi chương trình cần phải tương tác với các đối tượng từ các ngôn ngữ lập trình động giống như Python hoặc Ruby, hay là làm việc với các đối tượng mà có sự thay đổi về mặt cấu trúc như HTML hoặc DOM. Qua đó chúng ta có thể sử dụng nhiều ngôn ngữ khác nhau trên cùng một ứng dụng. Các đoạn mã của C#, VB.NET, IronPython,Javascripts… có thể hòa trộn với nhau để tạo ra một chương trình hoàn chỉnh.
Với dynamic trong .NET 4.0, khi lập nhận được một đối tượng, chúng ta không cần phải quan tâm đối tượng đó đến từ COM, IronPython hay HTML DOM hoặc Reflection. Chúng ta có thể sẵn sàng áp dụng các phép toán cho nó và để cho môi trường thực thi quyết định phép toán nào sẽ áp dụng cho đối tượng nào.
Lấy ví dụ:
Gọi phương thức từ lớp C#
Calculator calc = GetCalculator();
int sum = calc.Add(10, 20);
Gọi thông qua Reflection:
object calc = GetCalculator();
Type calcType = calc.GetType();
object res = calcType.InvokeMember("Add",
BindingFlags.InvokeMethod, null,
new object[] { 10, 20 });
int sum = Convert.ToInt32(res);
Gọi thông qua DOM:
ScriptObject calc = GetCalculator();
object res = calc.Invoke("Add", 10, 20);
int sum = Convert.ToInt32(res);
Với dynamic C# 4: Chúng ta không cần quan tâm đối tượng trả về từ phương phương thức GetCalculator() thuộc lớp C#, Reflection hay DOM. Trong khi chúng ta vẫn có thể tiến hành gọi phương thức Add của nó. Rõ ràng doạn mã này ngắn gọn và dễ hiểu hơn rất nhiều trước đó.
dynamic calc = GetCalculator();
int sum = calc.Add(10, 20);
System.Dynamic.DynamicObject
. NET 4.0 giới thiệu một lớp mới gọi là DynamicObject cho phép định nghĩa các hành vi có thể được thực thi trong quá trình chạy. Đây là một đặc trưng rất mới trong .NET 4.0. Chúng ta biết rằng các đối tượng trong .NET 3.5 và trước đó đều phải xác định cấu trúc và các hành vi trong quá trình biên dịch. Với DynamicObject cho phép các lập trình viên xây dựng các đối tượng một cách linh hoạt hơn. Việc lấy giữ liệu hay xác định hành vi cho đối tượng có thể được quyết định và thực thi trong quá runtime. Lập trình viên sẽ viết mã để điều khiển quá trình lấy và thao tác giữ liệu cho đối tượng. Điều này sẽ rất có ích khi chúng ta làm việc các đối tượng có sự thay đổi về mặt cấu trúc như XML hay ADO object.
Lấy ví dụ: Bài toán đọc một đối tượng XML
Trước hết chúng ta khai báo một lớp kế thừa từ DynamicObject
public class EasierXML : DynamicObject
{
private XDocument _xml = new XDocument();
public EasierXML(string Xml)
{
this._xml = XDocument.Parse(Xml);
}
public override bool TryGetMember(GetMemberBinder binder,
out object result)
{
string nodeName = binder.Name;
result = _xml.Element("test").Element(nodeName).Value;
return true;
}
}
Chúng ta sử dụng đối tượng này để đọc cấu trúc XML như sau:
dynamic easierXML =
new EasierXML(@"<test><node1>Alpha</node1><node2>Beta</node2></test>");
Console.WriteLine(easierXML.node1);
Console.WriteLine(easierXML.node2);
Trong ví dụ này, phương thức TryGetMember() được gọi đến cho node1, node2, do đó cho phép
truy vấn tài liệu XML và trả lại các nút riêng lẻ. Trong trường hợp cấu trúc XML có sự thay đổi, có một số node nào đó được thêm, chúng ta chỉ việc gọi đến easierXML.node3, easierXML.node4,.. mà không cần phải thay đổi đến lớp EasierXML
Một ví dụ khác, sử dụng DynamicObject còn giúp chương trình giảm thiểu được các lỗi phát sinh trong quá trình ép kiểu giữ liệu khi chúng ta làm việc với các đối tượng ADO.
Theo cách lập trình thông thường: chúng ta phải tiến hành ép kiểu mỗi khi đọc giá trị từ database
com.CommandText = "SELECT * FROM Employees";
using (IDataReader reader = com.ExecuteReader())
{
while (reader.Read())
{
int id = Int32.Parse(reader["EmployeeID"].ToString());
string firstName = reader["FirstName"].ToString();
DateTime dob = DateTime.Parse(reader["BirthDate"].ToString());
}
}
Sử dụng dynamic: kiểu dữ liệu được tự động xác định trong quá trình thực thi
com.CommandText = "SELECT * FROM Employees";
using (IDataReader reader = com.ExecuteReader())
{
dynamic dr = new DynamicReader(reader);
while (reader.Read())
{
int id = dr.EmployeeID;
string firstName = dr.FirstName;
DateTime dob = dr.BirthDate;
}
}
Ứng dụng dynamic cho WPF 4 trong quá trình gắn kết giữ liệu động (dynamic binding)
Trên đây là nét đặc trưng trong nền tảng ngôn ngữ .NET 4.0 đó là dynamic programming. Vậy chúng ta có thể ứng dụng nó vào các bài toán thực tế như thế nào? Lấy một ví dụ cho một ứng dụng desktop client sử dụng WPF. Như chúng ta biết rằng WPF tách biệt phần hiển thị của ứng dụng với các đoạn mã logic. Điều đó giúp cho các lập trình viên và các nhà thiết kế có thể làm việc độc lập mà vẫn không ảnh hưởng tới quá trình phát triển của ứng dụng. Các ứng dụng ngày nay thường được phát triển thông qua kiến trúc nhiều tầng. Một kiến trúc căn bản bao gồm tầng thể hiện, tầng logic nghiệp vụ và tầng thao tác dữ liệu. Thông thường, tầng thể hiện sẽ phát sinh nhiều yêu cầu thay đổi nhất từ phía khách hàng, trong khi tầng thao tác giữ liệu phải đảm bảo tính ổn định về mặt kiến trúc. Dó đó một kiến trúc tốt cần đảm bảo những yêu cầu thay đổi từ phía khach hàng không làm ảnh hưởng quá nhiều đến thiết kệ hiện có của ứng dụng, đặc biệt là các thiết kế liên quan đến thao tác giữ liệu.
Xét một ví dụ sau: Quản lý thông tin cá nhân
Giữ liệu được lưu trong 1 file XML có cấu trúc:
<?xml version="1.0" encoding="utf-8" ?>
<People>
<Person>
<FirstName>Quang</FirstName>
<LastName>Nguyễn Bá</LastName>
</Person>
<Person>
<FirstName>Cường</FirstName>
<LastName>Trịnh Minh</LastName>
</Person>
Các tiếp cận trước đây (chưa có dynamic)
Thực thể (Business Entity)
Khai báo một lớp Person
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
Thao tác giữ liệu (Data access)
Lấy giữ liệu từ nguồn (trong ví dụ này sử dụng XML là nguồn lưu trữ giữ liệu, tương tự chúng ta có thể thay thế XML bằng CSDL có cấu trúc như SQL Server, Oracle)
public IEnumerable<Person> GetData()
{
XDocument oDoc = XDocument.Load("People.xml");
var myData = from info in oDoc.Descendants("Person")
select new Person
{
FirstName = info.Element("FirstName").Value,
LastName = info.Element("LastName").Value,
};
return myData.ToList<Person>();
}
Hiển thị (Presentation)
Gắn kết giữ liệu và hiển thị lên controls:
<DataGrid Name="myDataGrid" VerticalAlignment="Top" ItemsSource="{Binding}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTextColumn x:Name="firstNameColumn"
Binding="{Binding Path=FirstName}"
Header="First Name" Width="SizeToHeader" />
<DataGridTextColumn x:Name="lastNameColumn"
Binding="{Binding Path=LastName}"
Header="Last Name" Width="SizeToHeader" />
</DataGrid.Columns>
</DataGrid>
Điều gì sẽ xảy ra nếu khách hàng yêu cầu quản lý thêm thông tin về tuổi (Age) và giới tính (isMale). Rõ ràng với cách thiết kế trên chúng ta phải thay đổi tất cả các tầng trong kiến trúc của ứng dụng. Điều đó làm tăng chi phí cho việc nâng cấp ứng dụng, điều mà cả khách hang và nhà phát triển đều không mong muốn.
Vậy làm sao để giải quyết vấn đề trên?
Sử dụng dynamic binding (gắn kết động)
Thực thể (Business Entity)
Triển khai DynamicObject. Lớp này có thể sử dụng cho tất cả các nguồn giữ liệu là XML mà không phân biệt cấu trúc của nó. Nhiệm vụ của nó là lấy ra một cách chính xác giá trị trong các thẻ XML
class DynamicXML : DynamicObject
{
XElement _element;
public ReadXML(XElement e) { _element = e; }
public override bool TryGetMember(GetMemberBinder binder,
out object result)
{
//Triển khai phương thức lấy giá trị của đối tượng
}
}
Thao tác giữ liệu (Data access)
Lấy giữ liệu từ nguồn và trả về đối tượng dynamic
dynamic GetPersonData()
{
var root = XElement.Load("People.xml");
dynamic xml = new DynamicXML(root);
return xml.Person;
}
Hiển thị (Presentation)
Gắn kết giữ liệu và hiển thị lên controls
<DataGrid Name="myDataGrid" VerticalAlignment="Top" ItemsSource="{Binding}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTextColumn x:Name="firstNameColumn"
Binding="{Binding Path=FirstName}"
Header="First Name" Width="SizeToHeader" />
<DataGridTextColumn x:Name="lastNameColumn"
Binding="{Binding Path=LastName}"
Header="Last Name" Width="SizeToHeader" />
</DataGrid.Columns>
</DataGrid>
Trong trường hợp khách hàng yêu cầu quản lý thêm thông tin về tuổi (Age) và giới tính (isMale). Điều duy nhất mà chúng ta phải làm đó là yêu cầu người thiết kế ứng dụng thêm đoạn mã sau vào phần hiển thị, trong khi không phải thay đổi hay biên dịch lại các tầng khác của ứng dụng. Qua đó đảm bảo tính vững chắc của kiến trúc chương trình cũng như giảm thiểu chi phí cho nâng cấp ứng dụng rất nhiều mỗi khi có yêu cầu thay đổi từ phía khách hàng.
<DataGridTextColumn x:Name="ageColumn" Binding="{Binding Path=Age}" Header="Age" Width="SizeToHeader" />
<DataGridTextColumn x:Name="isMaleColumn" Binding="{Binding Path=IsMale}" Header="Is Male" Width="SizeToHeader" />
Rõ ràng, với cách tiếp cận sử dụng dynamic, chúng ta thấy rằng số lượng mã cần thiết để viết và thay đổi cho một chức năng của chương trình ít hơn rất nhiều cách trước đó.
Kết luận
Trong tháng 4/2001 Microsoft sẽ chính thức ra mắt bộ công cụ Visual Studio 2010 và nền tảng phát triển .NET 4.0. Sự kiện này đã và đang mở ra hướng mới trong ngành công nghiệp phần mềm, với sự linh hoạt và khả năng xây dựng ứng dụng một cách nhanh chóng mà vẫn đáp ứng được những yêu cầu ngày các khắt khe của người dùng.
basquang@hotmail.com
source code
Phần mềm này tôi viết ra để giúp vợ tôi dễ dàng hơn trong việc quản lý chi tiêu trong gia đình. Bằng cách sử dụng điện thoại di động là một chiếc smartphone O2 mini S, người dùng có thể dễ dàng quản lý thông tin thu/chi theo thời gian, qua đó xác định được kế hoạch cho việc chi tiêu sắp tới.
Các chức năng chính bao gồm:
1. Nhập thông tin Thu/Chi
2. Xem báo cáo: Cho phép người dùng lọc thông tin báo cáo theo ngày tháng và loại thay đổi Thu/Chi
3. Thao tác trên máy tính: Chức năng này cho phép đồng bộ dữ liệu giữa điện thoại và máy tính. Cho phép người dùng có thể thao tác dữ liệu trên máy tính bằng công cụ Microsoft Office InfoPath
Phần mềm tương thích với Windows Mobile 5, 6, 7. Các bạn download tại địa chỉ sau: http://cid-a21319952f68e79e.skydrive.live.com/self.aspx/.Public/MoneyManagement/MoneyManagement.rar
Đây là một phần mềm hết sức đơn giản. Các bạn có thể tự tạo những phần mềm hữu ích cho mình trên nền Windows Mobile cũng như Windows sử dụng công cụ Visual Studio. Với ứng dụng cho Windows Phone 7, các bạn có thể xem các bài hướng dẫn rất hay tại địa chỉ
http://channel9.msdn.com/learn/courses/WP7TrainingKit/

Cascading drop-down is a common business requirement. SharePoint 2007 does not support cascading drop-down list by default. User have to write custom SharePoint field and it’s not easy to implement. With SharePoint 2010, User able to customize SharePoint form in easy way by using the powerful of InfoPath Designer. Following is the step guides to create a cascading drop-down list solution in SharePoint 2010 without require a lot of IT knowledge.
Scenario: We build a cascading for Address List. We have three list: City, District and Ward
1. Create City List
- In SharePoint 2010, create a custom List and named as “City”
- Add Two Item to this list: Hanoi and TP HCM
2. Create District List
- In SharePoint 2010, create a custom List and named as “District”
- Create a Lookup column named as “City”. This column get information from City List in the column Title.
- Add 4 items to District list
3. Create Ward List
- In SharePoint 2010, create a custom List and named as “Ward”.
- Create a Lookup column named as “City”. This column get information from City List in the column Title.
- Create a Lookup column named as “District”. This column get information from District List in the column Title.
- Create on Add new Item link you will see. When we choose City, District still have 4 item.
4. Customize Ward form to meet cascading requirement
- In Ward List, click on Customize Form ribbon button
- System will automatically open the form template of Ward list in InfoPath Designer
- Right click on District drop-down list control then select Drop-Down List box Properties from menu to open the properties windows
- In Data Source. Click on Add button
- In Data Connection Wizard, click on Next button
- In Select the source of your data, choose SharePoint library of list then click Next button
- In SharePoint Site details screen, click on Next button
- In Select a list of library, choose District the click on Next button
- In select fields: Choose Title, City, ID then click on Next button
- In next screen, choose Next button
- Leave the default name for the connection as “District1” then click Finish button
- Now, You will see the Data Source of Drop-Down list box is District1
- In Entries section, click on the tree button to select XPath
- In Select a Field or Group dialog, click on Filter Data… button
- In Filter Data click on Add… button
- In specify Filter Conditions, in the first drop-down list choose Select a field or group
- Select a Field or Group opened. Select District1 as Data Source, choose City in dataFields then click OK
- In specify Filter Conditions, in the last drop-down list choose Select a field or group
- Select a Field or Group opened. Select Main as Data Source then choose City in dataFields then click OK
- Click on OK to close specify Filter Conditions dialog
- Click on OK to close Filter Data dialog
- Click on OK to close Select a Field or Group
- In Drop Down List box properties, choose d:ID in Value: section then click OK to close this
- In InfoPath Designer, close the Windows then choose the Save and Publish button
- After Publishing complete, back to Ward list then click on Add new item link. You will see the result
Two drop-down list has been cascading.
Conclusion
SharePoint 2010 provides a easy way for none IT to customize the look and feel of SharePoint by using InfoPath Designer, SharePoint Designer. Customize form by using InfoPath Designer 2010 is a great new feature of SharePoint 2010. It’s very cool!
Phiên bản SharePoint 2007 đã có bản Language Pack hỗ trợ tiếng Việt từ ngày 20/07/2009. Người dùng Việt Nam chưa cài đặt bản ngôn ngữ tiếng Việt cho SharePoint có thể tải về tại địa chỉ
SharePoint Server 2007 Language Pack (X86) http://www.microsoft.com/downloads/details.aspx?displaylang=vi&FamilyID=430dabac-146e-4c8b-9338-37569ad373d2
SharePoint Server 2007 Language Pack (X64) http://www.microsoft.com/downloads/details.aspx?displaylang=vi&FamilyID=0c498ce5-47c2-47ad-9ae7-5a2cd2a81fc7
Windows SharePoint Services 3.0 Language Pack http://www.microsoft.com/downloads/details.aspx?displaylang=vi&FamilyID=36ee1bf0-652c-4e38-b247-f29b3eefa048
Windows SharePoint Services 3.0 Language Pack (X64) http://www.microsoft.com/downloads/details.aspx?displaylang=vi&FamilyID=45fa2637-efc0-4ed6-8f47-8a013e9ce9d9
Gói ngôn ngữ tiếng Việt thật sự hữu ích đối với sự phát triển của SharePoint tại Việt Nam, càng mang lại ấn tượng tốt đối với người dùng về sản phẩm này.
Hy vọng phiên bản SharePoint 2010 tới có bản language pack cho tiếng Việt đi kèm luôn trong ngày ra mắt để người dùng SharePoint ở Việt Nam khỏi phải mong mỏi lâu.
Phiên bản SharePoint 2010 Beta đã được công bố và có thể tài về từ Microsoft Website. Không giống như các phiên bản trước đó, yêu cầu môi trường Windows Server. Phiên bản 2010 này các bạn có thể cài đặt trên nền Windows 7 hiện có mà không cần phải cài thêm bất cứ công cụ hỗ trợ nào (baamboo solution trên V3). Điều đó đã tạo điều kiện thuận tiện hơn cho các lập trình viên phát triển và tùy biến SharePoint mà không cần cài đặt Windows Server hoặc sử dụng máy ảo.
Hướng dẫn chi tiết quá trình cài đặt các bạn tham khảo tại địa chỉ
http://msdn.microsoft.com/en-us/library/ee554869(office.14).aspx
Quang
Microsoft đã chính thức công bố phiên bản beta cho SharePoint 2010 và Office 2010. Có rất nhiều cải tiến đối với phiên bản này, đặc biệt với SharePoint. Đó là Office Web Access, giao diện Ribbon, tích hợp chuyên sâu, hỗ trợ Lotus Notes,…dễ dàng tùy biến và phát triển với VS 2010, SharePoint Designer 2010
Chúng ta hãy download và dùng thử phiên bản này nhé!
Resource: http://msdn.microsoft.com/en-us/sharepoint/ee514561.aspx
This article provides a first look at tools in Visual Studio 2010 designed to support development and deployment of SharePoint 2010 solutions. The article provides an example of designing and deploying a visual Web part.
Steve Fox
http://msdn.microsoft.com/en-us/magazine/ee309510.aspx
Vocabulary Reminder là một phần mềm trợ giúp cho việc học ngoại ngữ của mỗi người.
- Xuất phát từ yêu cầu thực tế là nhu cầu học ngoại ngữ, trong đó có từ vựng. Chúng ta thường học từ vựng bằng cách viết ra những mẩu giấy nhỏ hoặc viết lên bảng. Hoặc với những người hay sử dụng máy tính thì sử dụng sticknote trên Desktop. Tuy nhiên điều đó đem lại khá nhiều bất tiện.
- Từ yêu trên, tôi đã có ý tưởng thiết kế một phần mềm phục vụ cho việc học từ vựng này. Xét thấy các thông báo trên thanh trạng thái của Windows rất hữu hiệu cho việc ghi nhớ. Chẳng hạn như khi Laptop của chúng ta hết pin, hệ thống sẽ có một thông báo nhỏ trên khay hệ thống để nhắc nhở. Tôi đã tận dụng ý tưởng này để thiết kế ra phần mềm học ngoại ngữ nhọn gọn mà tiện dụng.

- Các chức năng chính của phần mềm bao gồm:
+ Cho phép người sử dụng quản lý từ cần học (Thêm, sửa xóa.
+ Cho phép người dùng phóng to thu nhỏ ứng dụng tùy thuộc vào kích cỡ và độ phân giả màn hình
+ Hệ thống xuất hiện các từ vựng trên khay hệ thống một cách tuần tự.
+ Hệ thống lưu giữ những từ đang học cho những lần sử dụng tiếp theo
- Ngoài chức năng học từ vựng, mọi người có thể sử dụng phần mềm này để ghi nhớ những việc cần làm, hoặc mọi thứ có nhu cầu ghi nhớ, nhắc nhở.
- Phần mềm được phát triển trên nền tảng .NET Framework do đó, để sử dụng được phần mềm, các bạn cần cài đặt .NET Framework 3.5 SP1. Đây là một ứng dụng thực tế nho nhỏ mà tôi đã tận dụng các công nghệ hiện có của Microsoft .NET. Các kỹ thuật được sử dụng chủ yếu trong phần mềm này là WPF XAML, WPF Data Binding, LINQ to XML và ClickOnce. Các bạn có thể tự phát triển phần mềm tương tự theo mục đích sử dụng của bạn mà không mất quá nhiều thời gian. Thời gian để tôi hoàn thiện ứng dụng này là trọn một ngày cuối tuần. Tuy vậy tôi rất happy vì nó mang lại hiệu quả đáng kể.
Cài đặt và sử dụng:
Các bạn có thể download phần mềm để cài đặt tại địa chỉ http://cid-a21319952f68e79e.skydrive.live.com/self.aspx/.Public/WPF/EnglishVocabularyReminder%5E_v1.0.rar
Chương trình tương thích với Windows 7, Windows Vista, Windows XP.
Sau khi download các bạn giải nén, và sử dụng file Setup.exe để cài đặt
Sau khi quá trình cài đặt hoàn tất các bạn có thể sử dụng phần mềm trong Start Menu
Sau đó các bạn click vào biểu tượng của ứng dụng trên khay hệ thống để cập nhật từ vựng. Sau khi cập nhật xong đóng cửa xổ lại để Reminder bắt đầu hoạt động
Để thoát chương trình chúng ta phải chuột vào biểu tượng của chương trình trên khay hệ thống và chọn Exit
Chúc các bạn vui với chương trình và không quên phản hồi nếu có bất cứ ý kiến gì về chương trình.
Mọi ý kiến xin liên hệ

If you're new to SharePoint, or working with people who are new to SharePoint and have a hard time explaining what it is, you might find the SharePoint in Plain English video to be helpful.
This video takes a friendly approach to show how SharePoint can help you work together with others in more efficient ways. For example, SharePoint can help you plan and work on a project online instead of sending files back and forth in e-mail.
Link to the video: http://www.microsoft.com/video/en/us/details/76e8d3af-c2bd-42a6-bb12-befcbd041bf1
source: MSSharePoint
Trước hết đó là giao diện cài đặt mới. Với sự hỗ trợ của Microsoft SharePoint Products and Technologies 14 Preparation Tool, hầu như chúng ta không phải mất công để chuẩn bị môi trường cài SharePoint 14. Chỉ cần OS (có thể SQL Server nếu cài Farm). Tool sẽ tự động cài đặt và cấu hình các yêu cầu cần thiết.
Sau khi quá trình cài đặt hoàn tất. Đó là sự xuất hiện của Central Admin hoàn toàn mới để cấu hình.
Một giao diện mới, hỗ trợ thêm các Tabs: Browse, Edit….Kiểu giao diện tương đối đồng nhất với Office 2007
Rất nhiều services đi kèm: Visio, Lotus Note, Business Data Catalog….
Application Management
Tạo Site Collections
Đây là bản SharePoint Server 2010 (SharePoint 14) Technical Review , chưa phải chính thức.
In MOSS 2007 and WSS 3, we have “People and Group” field to specify User or Group. Some time we need to set default value for this. But It’s not default function of “People and Group”. You must create one custom field using Visual Studio 2008 Extensions for WSS 3 and Custom Field template. The code is very easy to write and understand:
public class CurrentUserFieldField : SPFieldUser
{ public CurrentUserFieldField(SPFieldCollection fields, string fieldName)
: base(fields, fieldName)
{ }
public CurrentUserFieldField(SPFieldCollection fields, string typeName, string displayName)
: base(fields, typeName, displayName)
{ }
public override string DefaultValue
{ get
{ SPWeb web = SPContext.Current.Web;
SPUser currentUser = web.CurrentUser;
return string.Format("{0};#{1}", currentUser.ID.ToString(), currentUser.Name); }
set
{ base.DefaultValue = value;
}
}
}
Sometime, we need to set item permission dynamically for SharePoint List item or SharePoint Document. To do that, we create Item event handler then implement extension method for setting permission to the item.
the code as following:
| public static SPListItem SetItemLevelPermission(this SPListItem listItem, SPPrincipal userOrGroup, SPRoleType roleType) { SPListItem item = listItem; Guid listId = listItem.ParentList.ID; Guid itemId = listItem.UniqueId; SPUserToken token = item.Web.Site.SystemAccount.UserToken; SPSecurity.RunWithElevatedPrivileges( delegate() { using (SPSite site = new SPSite(item.Web.Site.ID, token)) { site.AllowUnsafeUpdates = true; using (SPWeb web = site.OpenWeb(item.Web.ID)) { web.AllowUnsafeUpdates = true; SPWebApplication webApp = web.Site.WebApplication; webApp.FormDigestSettings.Enabled = false; item = web.Lists[listId].Items[itemId]; item.BreakRoleInheritance(false); web.AllowUnsafeUpdates = true; SPRoleDefinition roleDefinition = web.RoleDefinitions.GetByType(roleType); SPRoleAssignment roleAssignment; roleAssignment = new SPRoleAssignment(userOrGroup); roleAssignment.RoleDefinitionBindings.Add(roleDefinition); item.RoleAssignments.Add(roleAssignment); item.Update(); // call this function before finished webApp.FormDigestSettings.Enabled = true; web.AllowUnsafeUpdates = false; } } } ); return item; } |
In the ItemAdding or ItemAdded Event, We use:
| public override void ItemAdded(SPItemEventProperties properties) { SPWeb currentWeb = properties.ListItem.Web; SPUser currentUser = currentWeb.CurrentUser; properties.ListItem.SetItemLevelPermission(currentUser, SPRoleType.Contributor); } |
I’ve waiting for “LINQ to SharePoint” feature from Microsoft a long time. Now, with SharePoint SP2 and VS 2008, We’ll easy to use LINQ feature to query SharePoint data.
Before, I tried to use “LINQ for SharePoint” from CodePlex, but I didn’t happy. I think the support from Microsoft for LINQ to SharePoint is the best.
Thanks for the improvement. I’m waiting for some improve features in next version of SharePoint, maybe SharePoint 2010.
Here are my code using LINQ with SharePoint data
| SPSite site = new SPSite("http://basquang:8001"); SPWeb web = site.RootWeb; var listItems = from SPListItem item in web.Lists["Tasks"].Items where DateTime.Parse(item["Due Date"].ToString()) <= DateTime.Today select item; foreach (var item in listItems) { Console.WriteLine(item.Title); } |