 |
|
ขอแนวคิดในการ set value ให้ properties ของ class หน่อยครับ [vb.net] |
|
 |
|
|
 |
 |
|
เรื่องมันมีอยู่ว่าผมกำลังทำโปรแกรมสำหรับรองรับภาษาอะไรก็ได้บนโลก
โดยเริ่มต้นจะเป็นภาษาอังกฤษ ผมจึงสร้าง class ขึ้นมามี property อยู่ราวๆ 15,000
(หมายความว่า เก็บคำได้ 15,000 คำ) โดยแต่ละ property จะมีค่าว่างไว้ก่อน
และจะ set ค่าให้ property เหล่านั้นเมื่อเปิดโปรแกรม โดยค่าที่นำมา set จะเก็บไว้ใน xml ไฟล์
กระบวนการ คือ
1. ใช้ datatable อ่าน xml ไฟล์ใช้เวลาไม่ถึง 1 วินาที
2. ลูปเพื่อ set ค่าให้กับแต่ละ property โดยใช้คำสั่งดังนี้
Code (VB.NET)
Dim pType As Type = GetType(CurrentLanguage)
For Each dr As DataRow In gResourceTable.Rows
Dim name As String = dr("ResKey").ToString
Dim value2 As String = dr("ResDefualtText").ToString
Try
Dim pro As Reflection.PropertyInfo = pType.GetProperty(name, GetType(String))
pro.SetValue(gResourceClass, value2, Nothing)
pro = Nothing
Catch
End Try
Next
pType = Nothing
** คำอธิบาย
- CurrentLanguage เป็น Class ที่ว่าเก็บ Property 15,000 ค่า
- gResourceTable เป็น Datatable ที่ใช้อ่าน xml ไฟล์ขึ้นมา
- gResourceClass เป็น Object ของ CurrentLanguag ตั้งเป็น Public
เมื่อนำไปใช้จะใช้ดังนี้ เช่น
Me.lblUserName.Text = gResourceClass.UserNameWithColon
Me.lblPassword.Text = gResourceClass.PasswordWithColon
ปัญหามีอยู่ว่า
เมื่อเปิดโปรแกรมจะให้แสดง splash screen เพื่อลูป set ค่าให้กับแต่ละ property ใช้เวลาประมาณ 15 วินาที
เครื่องที่ใช้เทส Win 7 / Ram 4 GB / Core i5 ยังนานขนาดนี้ 
การแก้ปัญหาที่ทดลองทำแล้ว คือ เก็บค่ามันไว้ใน DataTable นั่นหละไม่ต้องลูปเมื่อเปิดโปรแกรม
แต่เวลาจะเอามาใส่ให้ label ก็ใช้ LINQ ไปเอาค่ามาจาก DataTable คราวนี้มาช้าที่ Event FormLoad แทน
ฟอร์มที่มีคำเยอะๆ ( 100 - 150 คำ) ใช้เวลาโดยเฉลี่ย 7 วินาที - -*
ใครมีแนวทางที่จะทำให้มันเร็วได้ แชร์กันหน่อยนะครับ
การให้ความรู้ ย่อมชนะการให้ทั้งปวง เอ๊ะ !! มันแปลกๆนะภาษิตนี้
ขอบคุณล่วงหน้าครับ
Tag : .NET, Win (Windows App), VB.NET, VS 2008 (.NET 3.x), Windows
|
ประวัติการแก้ไข 2013-04-11 17:24:45
|
 |
 |
 |
 |
Date :
2013-04-11 17:23:01 |
By :
คนงานตัดอ้อย |
View :
1627 |
Reply :
5 |
|
 |
 |
 |
 |
|
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ใช้เป็นพวก Process Background ได้หรือเปล่าครับ คือในขณะที่ทำงานก็ค่อย ๆ อ่านไฟล์มาเก็บไว้ครับ
ผมไม่รู้ว่า Step การทำงานมันเป็นยังไง และทำไมจะต้องเอาลงครั้งเดียวตั้ง 15,000 รายการครับ
|
 |
 |
 |
 |
Date :
2013-04-12 11:58:07 |
By :
mr.win |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
www.codeproject.com
Search : monkey but fast 1, 2, 3
|
 |
 |
 |
 |
Date :
2013-04-15 21:58:52 |
By :
อาจ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เรื่องมันมีอยู่ว่าผมกำลังทำโปรแกรมสำหรับรองรับภาษาอะไรก็ได้บนโลก
โดยเริ่มต้นจะเป็นภาษาอังกฤษ ผมจึงสร้าง class ขึ้นมามี property อยู่ราวๆ 15,000
(หมายความว่า เก็บคำได้ 15,000 คำ) โดยแต่ละ property จะมีค่าว่างไว้ก่อน
และจะ set ค่าให้ property เหล่านั้นเมื่อเปิดโปรแกรม โดยค่าที่นำมา set จะเก็บไว้ใน xml ไฟล์
กระบวนการ คือ
[/b]ผมเป็นคนไทยคนหนึ่ง ผมจำได้ว่า (บ้าง) ... ผมจำไม่ได้ว่า (รู้ว่า) ณ.ปัจจุบัน 2556-04-16 บริษัท Windows MS-Sooft จำกัด [b]มหาโลก
มันสนับสนุน ภาษาไทย (Support Thai Language) ได้ไม่เต็มหนึ่งร้อยเปอร์เซ้งต์ (100%)
----- ผมไม่รู้เหตุผลที่แท้จริง ว่าทำไม?
|
 |
 |
 |
 |
Date :
2013-04-16 21:11:19 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เก็บเป็น xml ก็ใช้ linq สิ
ไม่ต้องโหลดใส่ datatable หรอก เสียเวลา
Code (XML)
<?xml version="1.0" encoding="UTF-8"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2012-05-09T18:22:07">
<Roles>
<ID>1</ID>
<TypeID>1</TypeID>
<RoleName>Admin</RoleName>
</Roles>
<Roles>
<ID>2</ID>
<TypeID>1</TypeID>
<RoleName>Member</RoleName>
</Roles>
</dataroot>
Code (C#)
var roles = from rt in XElement.Load(".....PATH...../Role.xml").Elements("Roles")
select rt;
// Execute the query
foreach (var role in roles )
{
int TypeID = Convert.ToInt32(role.Element("TypeID").Value);
string RoleName = role.Element("RoleName").Value;
}
|
 |
 |
 |
 |
Date :
2013-04-17 08:20:10 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
Code (VB.NET)
Imports System.Reflection
Imports System.ComponentModel
Public Class ReflectionButFaster
Public Class CurrentLanguage
Public Property ResKey As String
Public Property ResDefaultText As String
'more...
End Class
Protected Sub btnTestData_Click(sender As Object, e As EventArgs) Handles btnTestData.Click
Dim x As New List(Of CurrentLanguage)
For i As Integer = 0 To 100000 'หนึ่งแสนคำ
x.Add(New CurrentLanguage() With {.ResKey = "Test" & i, .ResDefaultText = String.Empty})
Next
MsgBox("Generate Test Data Complete")
For Each r In x
ReflectionButFaster(r, "ResDefaultText", "Love JimThai")
Next
MsgBox("Change Test Data Complete")
End Sub
Private Shared Sub ReflectionButFaster(ByVal obj As Object, ByVal PropertyName As String, ByVal NewValue As String)
Dim propsCollect As PropertyDescriptorCollection = TypeDescriptor.GetProperties(obj)
propsCollect(PropertyName).SetValue(obj, NewValue)
End Sub
End Class
|
 |
 |
 |
 |
Date :
2013-04-18 18:33:40 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|