|
|
Copyright © 2003-2009 By Suthep Sangvirotjanaphat |
|
|
|
Mobile: 089-967-2200, 081-915-7816 Phone: 0-2992-4877 Fax: 0-2992-4878 Fast Contact Us |
GreatFriends.Biz Community |
Custom Search
|
เกริ่นนำ
|
|
tapeza555 |
วันที่ส่ง: 18 มี.ค. 52 17:46 GMT+7 วันที่ปรับล่าสุด: 22 มิ.ย. 52 10:57 GMT+7 |

|
|
tapeza555 |
วันที่ส่ง: 18 มี.ค. 52 18:12 GMT+7 วันที่ปรับล่าสุด: 18 มี.ค. 52 18:12 GMT+7 |
Tag : ASP.NET/Javascript
How To : Focus TextBox หลังจาก Asp.net มัน PostBack
<asp:Content ID="Content1" ContentPlaceHolderID="cphMainContainer" Runat="Server">
<
asp:TextBox ID="TextBox1" AutoPostBack="true" runat="server" onfocus="setCurrentFocusId(this.id);" ></asp:TextBox> <asp:TextBox ID="TextBox2" AutoPostBack="true" runat="server" onfocus="setCurrentFocusId(this.id);" ></asp:TextBox> <asp:TextBox ID="TextBox3" AutoPostBack="true" runat="server" onfocus="setCurrentFocusId(this.id);" ></asp:TextBox> <br /> <asp:Button ID="Button1" runat="server" Text="Button" /> <asp:HiddenField ID="HiddenField1" runat="server" /><script type="text/javascript">
function setCurrentFocusId( id ){
document.getElementById('<%=HiddenField1.ClientID%>').value = id;
}
var currentFocusId = document.getElementById('<%=HiddenField1.ClientID%>').value;
if(currentFocusId != ""){
var currentTextBox = document.getElementById( currentFocusId );
//use for FF รู้สึกว่าแค่นี้ Firefox ก็ใช้ได้แล้ว
currentTextBox.focus();
//use for IE อันนี้สำหรับให้ IE ทำงาน if(currentTextBox.createTextRange) { var range = currentTextBox.createTextRange();range.move(
'character', currentTextBox.value.length);range.select();
}
}
</script></
asp:Content>|
|
tapeza555 |
วันที่ส่ง: 18 มี.ค. 52 18:46 GMT+7 วันที่ปรับล่าสุด: 18 มี.ค. 52 18:46 GMT+7 |
Tag:Error,.Net
Error In Action : Object reference not set to an instance of an object. ****
DataRow dr = dtEmp .NewRow(); <--- มันจะ Error บรรทัดนี้ ( dtEmp มันเป็น null )
int rowCount = dtEmp.Rows.Count;<-- ถ้ามัน Error บรรทัดนี้ ลองดูสิว่าน่าจะมาจากตัวไหน ???
|
|
tapeza555 |
วันที่ส่ง: 19 มี.ค. 52 11:14 GMT+7 วันที่ปรับล่าสุด: 19 มี.ค. 52 11:14 GMT+7 |
Tag: Javscript,ASP.Net
How To : Popup หน้า Window ใหม่และส่งค่ากลับ ทำยังไง ??? ( ภาค 1 )
<asp:Button ID="Button1" runat="server" Text="Button"
OnClientClick="return window.confirm( 'Submit to server?' );" OnClick="Button1_Click" />
protected void Button1_Click( object sender, EventArgs e ) {
//วิธีการ write script ให้กับหน้า web ของเรา เดี๋ยวผมไว้ค่อยเขียนที่บทความอื่นละกันครับ
//กรณีนี้ไม่ได้ใช้ AJAX นะครับ
Page.ClientScript.RegisterStartupScript( Page.GetType(), "", "window.alert('Hello GF!!');", true );
<asp:Button ID="Button1" runat="server" Text="Button" style="background-color:Gray" onmouseover="window.alert(' Hello ');" />
เดี๋ยวมาต่อครับตอน 2 ครับ วันนี้เหนื่อยแล้ว T_T
ยังไม่ได้เข้าเรื่อง เลย *-*
|
|
tapeza555 |
วันที่ส่ง: 19 มี.ค. 52 17:44 GMT+7 วันที่ปรับล่าสุด: 19 มี.ค. 52 17:44 GMT+7 |
How To : Popup หน้า Window ใหม่และส่งค่ากลับ ทำยังไง ??? ( ภาค 2 )
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<script type="text/javascript">// ผมสร้าง function UpdateData ในหน้าแม่ เพื่อเซตค่าให้กับ Control ในหน้านี้
function UpdateData(retValue){// คำสั่ง '<%=TextBox1.ClientID%>' เป็นการเอาค่า ID ของ Server Control หลังจาก Run แล้ว
// เนื่องจากหาก Page นี้ ใช้ MasterPage ID มันจะไม่ใช่ TextBox1
// แต่คำสั่ง Javascript document.getElementById ต้องใช้คู่กับ ID ที่มัน gen หลังจาก Run แล้ว
document.getElementById( '<%=TextBox1.ClientID%>' ).value = retValue;
</script>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>//มันอยู่ที่ว่าเราต้องการทำอะไร
//สำหรับกรณีนี้ ผมบอก แค่ Popup หน้าใหม่ ไม่อยากให้หน้ามัน Refresh เลยสั่ง return false
<asp:Button ID="Button1" runat="server" OnClientClick="return popupDialog();" Text="Button" />
//ถ้าใช้ Html Control แบบนี้ หรือ Control ที่ไม่มีการ Post เข้า server ก็ไม่จำเป็นต้อง return false;
<input id="Button2" type="button" onclick="window.open( 'PopupDialog.aspx' );" value="button" /> </asp:Content>// พอดี dotnet มันโวยวาย ตอนที่ผมเอา script ไปไว้ใน header
// ผมไม่อยากไปทะเลาะกับมัน เลยขอย้าย script ลงมาที่ body ละกันครับ
"The Controls collection cannot be modified because the control contains code blocks (i.e. <% ... %>)."
<script type="text/javascript">
function closeDialogOnClient(){ var retValue = document.getElementById( '<%=txtReturnText.ClientID%>' ).value;window.opener.UpdateData( retValue );
window.close();
}
function closeDialogOnServer( retValue ){window.opener.UpdateData( retValue );
window.close();
}
</script> <form id="form1" runat="server"> <div>//กรณีที่ผมไม่ return จาก function ผมก็สามารถ มา return false นี่ได้ครับ
<asp:Button ID="btnClientClose" runat="server" Text="ClientClose" OnClientClick="closeDialogOnClient(); return false;" />
//อันนี้ให้มัน Post ไปยัง server แล้วเรียกใช้ script closeDialogOnServer
<asp:Button ID="btnServerClose" runat="server" OnClick="btnServerClose_Click" Text="ServerClose" />//เอาความรู้ที่ผมเกริ่นใน REPLY #4 (102701) มาใช้
<asp:Image ID="Image1" runat="server" ImageUrl="~/Resources/Images/choose.gif"
style="cursor:pointer" onclick ="closeDialogOnClient()" />
<asp:TextBox ID="txtReturnText" runat="server"></asp:TextBox>
</div> </form></body>
// หน้า CodeBehide PopupDialog.aspx.cs สำหรับกรณีที่ กดbtnServerClose
protected void btnServerClose_Click( object sender, EventArgs e ) {
//ส่งค่า จาก txtReturnText ไปให้ function closeDialogOnServer
Page.ClientScript.RegisterStartupScript( Page.GetType(),
"", "closeDialogOnServer( '" + txtReturnText.Text + "' );", true );if(!Page.IsPostBack) {
btnClientClose.Attributes.Add( "onclick", "closeDialogOnClient();" );
}
}
|
|
tapeza555 |
วันที่ส่ง: 20 มี.ค. 52 15:27 GMT+7 วันที่ปรับล่าสุด: 20 มี.ค. 52 15:27 GMT+7 |
พอดีเห็น http://greatfriends.biz?102667 เกี่ยวกับ MVC อึมน่าสนใจดี
- MVC คืออะไร (Style tapeza555 )
|
|
tapeza555 |
วันที่ส่ง: 20 มี.ค. 52 15:43 GMT+7 วันที่ปรับล่าสุด: 20 มี.ค. 52 15:43 GMT+7 |
|
|
notarry |
วันที่ส่ง: 21 มี.ค. 52 00:43 GMT+7 วันที่ปรับล่าสุด: 21 มี.ค. 52 00:43 GMT+7 |
)ขอตอบคุณ notarry ก่อนครับ ว่าแทรกได้เลยครับ จริงผมไม่ได้ ซีเรียสอะไรหรอกครับ

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<script type="text/javascript"> function UpdateData(retValue){document.getElementById( '<%=TextBox1.ClientID%>' ).value = retValue;
</script>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><asp:Button ID="Button1" runat="server" OnClientClick="return popupDialog();" Text="OpenDialog" />
</asp:Content>
<body> <script type="text/javascript"> function closeDialog( retValue ){
window.opener.UpdateData( retValue );
window.close();
}
</script> <form id="form1" runat="server"> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"onrowdatabound="GridView1_RowDataBound">
<Columns> <asp:TemplateField> <ItemTemplate> <asp:Image ID="imgSelect" runat="server" /> </ItemTemplate> </asp:TemplateField> <asp:BoundField DataField ="ID" HeaderText="ID" /> <asp:BoundField DataField ="Description" HeaderText="Description" /> </Columns> </asp:GridView> </form></
body>
protected void GridView1_RowDataBound( object sender, GridViewRowEventArgs e ) {
if(e.Row.RowType == DataControlRowType.DataRow) {
Image imgSelect = (Image)e.Row.FindControl( "imgSelect" );
//อันนี้ผมใส่รูปมือให้มันตอนที่ Mouse มัน Over บน Image ใส่ใน code behide หรือจะไปใส่แบบเดิมที่หน้า Html ก็ได้นะครับ
imgSelect.Style.Add( HtmlTextWriterStyle.Cursor, "pointer" );
// e.Row.Cells[1].Text เนื่องจาก Column ของผมมันเป็น BoundField เลยเรียกใช้แบบนี้
imgSelect.Attributes.Add( "onclick", "closeDialog('" + e.Row.Cells[1].Text + "');" );
}
}
protected void GridView1_RowDataBound( object sender, GridViewRowEventArgs e ) {
if(e.Row.RowType == DataControlRowType.DataRow) {
e.Row.Style.Add( HtmlTextWriterStyle.Cursor, "pointer" );
e.Row.Attributes.Add( "ondblclick", "closeDialog('" + e.Row.Cells[ 1 ].Text + "');" );
}
protected void GridView1_RowDataBound( object sender, GridViewRowEventArgs e ) {
if(e.Row.RowType == DataControlRowType.DataRow) {
e.Row.Style.Add( HtmlTextWriterStyle.Cursor, "pointer" );
string myId = DataBinder.Eval( e.Row.DataItem, "ID" ).ToString();
e.Row.Attributes.Add( "ondblclick", "closeDialog('" + myId + "');" );
}
}
protected void GridView1_SelectedIndexChanging( object sender, GridViewSelectEventArgs e ) {
string myId = GridView1.Rows[ e.NewSelectedIndex ].Cells[ 1 ].Text;
Session[ "DoOnServer" ] = "อาจจะทำอะไรสักอย่าง แล้ว เก็บใส่ Session เพื่อใช้ต่อ";
Page.ClientScript.RegisterStartupScript( Page.GetType(), "", "closeDialog('" + myId + "');", true );
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" >
<Columns> <asp:TemplateField> <ItemTemplate> <asp:ImageButton ID="imbSelect" runat="server" onclick="imbSelect_Click" /> </ItemTemplate> </asp:TemplateField> <asp:BoundField DataField ="ID" HeaderText="ID" /> <asp:BoundField DataField ="Description" HeaderText="Description" /> </Columns> </asp:GridView>protected void imbSelect_Click( object sender, ImageClickEventArgs e ) {
//แปลงกับมาเป็น ImageButton
ImageButton imbSelect = (ImageButton)sender;
//ใช้ NamingContainer เพื่อเอา Row นั้นมาใช้ อยากใช้ Colunms อะไรหรือ อยาก Find Control อะไรก็สบายแล้วครับ
GridViewRow gvr = (GridViewRow)imbSelect.NamingContainer;
Page.ClientScript.RegisterStartupScript( Page.GetType(), "", "closeDialog('" + gvr.Cells[1].Text + "');", true );
}
document.getElementById( '<%=TextBox1.ClientID%>' ).value = retValue[0];
document.getElementById( '<%=TextBox2.ClientID%>' ).value = retValue[1];
var myArray = new Array();
myArray [0] = "ID001";
myArray [1] = "Name";
window.close();
}
document.getElementById( '<%=TextBox1.ClientID%>' ).value = retValue[0];
document.getElementById( '<%=TextBox2.ClientID%>' ).value = retValue[1];
document.getElementById( '<%=txtCustomerName.ClientID%>' ).value = retValue[1];

|
|
tapeza555 |
วันที่ส่ง: 8 เม.ย. 52 10:58 GMT+7 วันที่ปรับล่าสุด: 8 เม.ย. 52 10:58 GMT+7 |

|
|
Ixus |
วันที่ส่ง: 8 เม.ย. 52 19:15 GMT+7 วันที่ปรับล่าสุด: 8 เม.ย. 52 19:15 GMT+7 |
|
|
caesar |
วันที่ส่ง: 9 เม.ย. 52 16:29 GMT+7 วันที่ปรับล่าสุด: 9 เม.ย. 52 16:29 GMT+7 |
|
|
notarry |
วันที่ส่ง: 9 เม.ย. 52 23:24 GMT+7 วันที่ปรับล่าสุด: 9 เม.ย. 52 23:24 GMT+7 |
How To : ทำไม Session Timeout ไวจัง

|
|
tapeza555 |
วันที่ส่ง: 21 เม.ย. 52 15:52 GMT+7 วันที่ปรับล่าสุด: 21 เม.ย. 52 15:52 GMT+7 |
|
|
notarry |
วันที่ส่ง: 21 เม.ย. 52 19:06 GMT+7 วันที่ปรับล่าสุด: 21 เม.ย. 52 19:06 GMT+7 |
คือ จริงๆๆ ตั้งใจจะทำเองไม่อยาก ใช้ของฟรี แต่ยังไม่มีเวลาทำครับ

|
|
tapeza555 |
วันที่ส่ง: 22 เม.ย. 52 18:38 GMT+7 วันที่ปรับล่าสุด: 22 เม.ย. 52 18:38 GMT+7 |
Software Architecture =>OOP + Design Pattern + Layer + Tier มั่วนิ่ม ภาคที่ 1

เอามาใช้ตอนไหน ?
|
|
tapeza555 |
วันที่ส่ง: 14 พ.ค. 52 19:12 GMT+7 วันที่ปรับล่าสุด: 14 พ.ค. 52 19:12 GMT+7 |
|
|
Sand King |
วันที่ส่ง: 14 พ.ค. 52 21:52 GMT+7 วันที่ปรับล่าสุด: 14 พ.ค. 52 21:52 GMT+7 |
|
|
notarry |
วันที่ส่ง: 14 พ.ค. 52 23:31 GMT+7 วันที่ปรับล่าสุด: 14 พ.ค. 52 23:31 GMT+7 |

) 
protected void btnSaveReservation _Click( object sender, EventArgs e ) {
using(SqlConnection conn = new SqlConnection("Connection string")){
conn.Open();
SqlCommand cmd = new SqlCommand( @"Insert Into Reservation
(ReservationNo,ReservationDate)Values(@ReservationNo,@ReservationDate)", conn );
cmd.Parameters.AddWithValue( "@ReservationNo", this.getReservationNo() );
cmd.Parameters.AddWithValue( ",@ReservationDate", Convert.ToDateTime(txtReservationDate.Text));
cmd.ExecuteNonQuery();
}
}

Presentation Layer : ส่วนที่ติดต่อกับผู้ใช้ User Interface ( Window App , ASP.NET )
protected void btnSaveReservation _Click( object sender, EventArgs e ) {
ReservationDao dao = new ReservationDao();
dao.Save( Convert.ToDateTime( txtReservationDate.Text ) );
conn.Open();
SqlCommand cmd = new SqlCommand( @"Insert Into Reservation(ReservationNo,ReservationDate)Values(@ReservationNo,@ReservationDate)"
, conn );cmd.Parameters.AddWithValue(
"@ReservationNo", this.getReservationNo() );cmd.Parameters.AddWithValue(
",@ReservationDate", reservationDate );cmd.ExecuteNonQuery();
}
}

|
|
tapeza555 |
วันที่ส่ง: 15 พ.ค. 52 01:24 GMT+7 วันที่ปรับล่าสุด: 15 พ.ค. 52 01:24 GMT+7 |
คุณ Tape ครับ
|
|
tor |
วันที่ส่ง: 15 พ.ค. 52 09:45 GMT+7 วันที่ปรับล่าสุด: 15 พ.ค. 52 09:45 GMT+7 |
ขอบคุณ คุณ tor มากๆๆครับที่สนใจอ่านบทความ..
ReservationDao dao = new ReservationDao();
dao.Save( Convert.ToDateTime( txtReservationDate.Text ) );
}
|
|
tapeza555 |
วันที่ส่ง: 19 พ.ค. 52 09:57 GMT+7 วันที่ปรับล่าสุด: 19 พ.ค. 52 09:57 GMT+7 |
อึมม คำถามต่อมาคือ แบบ 3-Layer นี่เป็นยังไงครับ ใช้ Entity Framework หรือเปล่า ??
|
|
tapeza555 |
วันที่ส่ง: 19 พ.ค. 52 10:11 GMT+7 วันที่ปรับล่าสุด: 19 พ.ค. 52 10:11 GMT+7 |
|
|
Nine (นาย) |
วันที่ส่ง: 19 พ.ค. 52 10:14 GMT+7 วันที่ปรับล่าสุด: 19 พ.ค. 52 10:14 GMT+7 |
ก่อนที่จะไปไกลกว่านี้ ผมขอกลับมาที่คำว่า Layer ก่อนครับ ผมยังไม่ได้อธิบายไว้ใน
) ---> Presentation Layer
---> Data Access Layer 
|
|
tapeza555 |
วันที่ส่ง: 19 พ.ค. 52 10:46 GMT+7 วันที่ปรับล่าสุด: 19 พ.ค. 52 10:46 GMT+7 |
ReservationManager reservationManager = new ReservationManager();
reservationManager.Save(txtCustomerNo.Text,Convert.ToDateTime( txtReservationDate.Text ) );
ReservationDao dao = new ReservationDao();
dao.Save( Convert.ToDateTime( txtReservationDate.Text ) );
}
reservationManager.Save( txtCustomerNo.Text, reservationDate );
}
ReservationManager reservationManager = new ReservationManager();
reservationManager.Save(txtCustomerNo.Text,Convert.ToDateTime( txtReservationDate.Text ) );
ReservationDao dao = new ReservationDao();
dao.Save( Convert.ToDateTime( txtReservationDate.Text ) );
}
|
|
tapeza555 |
วันที่ส่ง: 19 พ.ค. 52 11:35 GMT+7 วันที่ปรับล่าสุด: 19 พ.ค. 52 11:35 GMT+7 |
.gif)
.gif)
|
|
tapeza555 |
วันที่ส่ง: 19 พ.ค. 52 11:53 GMT+7 วันที่ปรับล่าสุด: 19 พ.ค. 52 11:53 GMT+7 |
ก่อนที่จะไปเรื่องอื่น ตั้งแต่ต้น ผมจะใช้คำว่า Layer เท่านั้นไม่เอ่ยว่า Tier เลย

|
|
tapeza555 |
วันที่ส่ง: 19 พ.ค. 52 13:14 GMT+7 วันที่ปรับล่าสุด: 19 พ.ค. 52 13:14 GMT+7 |
|
|
Nine (นาย) |
วันที่ส่ง: 19 พ.ค. 52 13:58 GMT+7 วันที่ปรับล่าสุด: 19 พ.ค. 52 13:58 GMT+7 |
ขอบคุณมากครับ พี่ Nine อธิบายสั้นๆ แต่กระจ่าง เข้าใจง่ายดีครับ 
|
|
tapeza555 |
วันที่ส่ง: 19 พ.ค. 52 14:01 GMT+7 วันที่ปรับล่าสุด: 19 พ.ค. 52 14:01 GMT+7 |
อ่อ ลืมบอกประเด็นหลัก ที่ผมเขียน Blog นี้กับทุกท่านนะครับ

|
|
tapeza555 |
วันที่ส่ง: 19 พ.ค. 52 14:10 GMT+7 วันที่ปรับล่าสุด: 19 พ.ค. 52 14:10 GMT+7 |
|
|
Nine (นาย) |
วันที่ส่ง: 19 พ.ค. 52 14:12 GMT+7 วันที่ปรับล่าสุด: 19 พ.ค. 52 14:12 GMT+7 |
ขอบคุณมากๆๆ ครับผม ขอบคุณพี่มี่ ,พี่นาย ,อ. และก็ GF ด้วยครับ

|
|
tapeza555 |
วันที่ส่ง: 19 พ.ค. 52 14:19 GMT+7 วันที่ปรับล่าสุด: 19 พ.ค. 52 14:19 GMT+7 |
|
|
Nine (นาย) |
วันที่ส่ง: 19 พ.ค. 52 14:21 GMT+7 วันที่ปรับล่าสุด: 19 พ.ค. 52 14:21 GMT+7 |
|
|
notarry |
วันที่ส่ง: 19 พ.ค. 52 23:26 GMT+7 วันที่ปรับล่าสุด: 19 พ.ค. 52 23:26 GMT+7 |
ยีนดีด้วยครับ น้องเทปซ่าห้าห้าห้า
|
|
nano |
วันที่ส่ง: 20 พ.ค. 52 00:28 GMT+7 วันที่ปรับล่าสุด: 20 พ.ค. 52 00:28 GMT+7 |
|
|
Nameless |
วันที่ส่ง: 20 พ.ค. 52 09:54 GMT+7 วันที่ปรับล่าสุด: 20 พ.ค. 52 09:54 GMT+7 |
|
|
notarry |
วันที่ส่ง: 20 พ.ค. 52 10:36 GMT+7 วันที่ปรับล่าสุด: 20 พ.ค. 52 10:36 GMT+7 |
![]()
|
|
mie |
วันที่ส่ง: 21 พ.ค. 52 00:02 GMT+7 วันที่ปรับล่าสุด: 21 พ.ค. 52 00:02 GMT+7 |
|
|
mr.l |
วันที่ส่ง: 21 พ.ค. 52 01:19 GMT+7 วันที่ปรับล่าสุด: 21 พ.ค. 52 01:19 GMT+7 |

|
|
tapeza555 |
วันที่ส่ง: 21 พ.ค. 52 09:14 GMT+7 วันที่ปรับล่าสุด: 21 พ.ค. 52 09:14 GMT+7 |
จาก REPLY #20 (106519)

|
|
Jericho |
วันที่ส่ง: 21 พ.ค. 52 20:15 GMT+7 วันที่ปรับล่าสุด: 21 พ.ค. 52 20:15 GMT+7 |
ผมนิยาม Facade Pattern คือ Class ที่เอางานย่อยๆ มายำรวมกัน
|
|
Sand King |
วันที่ส่ง: 21 พ.ค. 52 23:04 GMT+7 วันที่ปรับล่าสุด: 21 พ.ค. 52 23:04 GMT+7 |
มาอ่านกระทู้ นี้ เข้า ใจ เรื่อง DAL BLL PL ขึ้นเยอะเลย ครับ และผม เวลาเขียนโปรเจคก็ทำแบบนี้ด้วย รู้ว่าสึกว่า อาจจะ code หนักหน่อยแต่ก็ แก้ปัญหาง่ายดีครับ
|
|
znalog |
วันที่ส่ง: 22 พ.ค. 52 00:02 GMT+7 วันที่ปรับล่าสุด: 22 พ.ค. 52 00:02 GMT+7 |
มีผลมั้ย ???
|
|
Sand King |
วันที่ส่ง: 22 พ.ค. 52 09:15 GMT+7 วันที่ปรับล่าสุด: 22 พ.ค. 52 09:15 GMT+7 |

|
|
ASPeXP |
วันที่ส่ง: 22 พ.ค. 52 14:55 GMT+7 วันที่ปรับล่าสุด: 22 พ.ค. 52 14:55 GMT+7 |
|
|
Nine (นาย) |
วันที่ส่ง: 22 พ.ค. 52 20:40 GMT+7 วันที่ปรับล่าสุด: 22 พ.ค. 52 20:40 GMT+7 |
|
|
notarry |
วันที่ส่ง: 22 พ.ค. 52 22:45 GMT+7 วันที่ปรับล่าสุด: 22 พ.ค. 52 22:45 GMT+7 |
ก่อนอื่น ผมต้องขอสรุป สิ่งที่ได้คุยไปก่อนหน้านี้นะครับ
|
|
tapeza555 |
วันที่ส่ง: 25 พ.ค. 52 02:41 GMT+7 วันที่ปรับล่าสุด: 25 พ.ค. 52 02:41 GMT+7 |
ReservationManager reservationManager = new ReservationManager();
reservationManager.Save(txtCustomerNo.Text,Convert.ToDateTime( txtReservationDate.Text ) );
ReservationManager reservationManager = new ReservationManager();
Reservation reservation = new Reservation ();
reservation .ReservationDate = Convert.ToDateTime( txtReservationDate.Text );
reservationManager.Save( reservation );
|
|
tapeza555 |
วันที่ส่ง: 25 พ.ค. 52 03:07 GMT+7 วันที่ปรับล่าสุด: 25 พ.ค. 52 03:07 GMT+7 |
โอ้...
คนเก่งมักจะนอนดึกอย่างนี้นี่เอง
พักผ่อนด้วยนะครับ จะได้มีแรงเขียนต่ออะครับ ... หงิๆ...
|
|
nano |
วันที่ส่ง: 25 พ.ค. 52 08:07 GMT+7 วันที่ปรับล่าสุด: 25 พ.ค. 52 08:07 GMT+7 |
คืออยากจะเรียนถาม นะครับ คือ ตอนนี้ ผมทำเป็นแบบ
|
|
znalog |
วันที่ส่ง: 26 พ.ค. 52 00:49 GMT+7 วันที่ปรับล่าสุด: 26 พ.ค. 52 00:49 GMT+7 |


ไว้คุยถึงตรงนั้น แล้วค่อยว่ากันครับ|
|
tapeza555 |
วันที่ส่ง: 26 พ.ค. 52 03:30 GMT+7 วันที่ปรับล่าสุด: 26 พ.ค. 52 03:30 GMT+7 |
โอ้...
คนเก่งมักจะนอนดึกอย่างนี้นี่เอง

|
|
tapeza555 |
วันที่ส่ง: 26 พ.ค. 52 03:47 GMT+7 วันที่ปรับล่าสุด: 26 พ.ค. 52 03:47 GMT+7 |
|
|
notarry |
วันที่ส่ง: 26 พ.ค. 52 08:28 GMT+7 วันที่ปรับล่าสุด: 26 พ.ค. 52 08:28 GMT+7 |
|
|
Nine (นาย) |
วันที่ส่ง: 26 พ.ค. 52 09:49 GMT+7 วันที่ปรับล่าสุด: 26 พ.ค. 52 09:49 GMT+7 |
|
|
tapeza555 |
วันที่ส่ง: 26 พ.ค. 52 10:14 GMT+7 วันที่ปรับล่าสุด: 26 พ.ค. 52 10:14 GMT+7 |
เปิดกระทู้ได้มีสาระ และน่าติดตามดี
|
|
Caos |
วันที่ส่ง: 26 พ.ค. 52 17:48 GMT+7 วันที่ปรับล่าสุด: 26 พ.ค. 52 17:48 GMT+7 |
QUESTION :
อ้าว Caos หายไปไหนซะนานเลยไม่ค่อยได้เจอ
ก่อนอื่นต้องขอตอบตรงนี้ก่อนแล้วกัน
1)ไม่ค่อยเห็นมีการพูดถึงเกี่ยวกับโครงสร้างของ Entity ว่าจะไปอยู่ส่วนไหนของ layer ใด
แล้วจะนำไปใช้งานอย่างไร
- ถูกต้องแล้วครับ 555+ ช่างสังเกตุ ดีจริงๆ ตั้งแต่ที่ได้เขียนเริ่มจนถึง ณ ตอนนี้ ผมยังไม่ได้เข้าเรื่องจริงๆเลย
เหมือนกับเป็นแค่การเกริ่นๆ อะ สังเกตุได้จากที่ Presentation Layer ยังเรียกใช้ Business Logic แบบนี้ อยู่เลย
ReservationManager reservationManager = new ReservationManager();
reservationManager.Save( txtCustomerNo.Text, Convert.ToDateTime(txtReservationDate.Text ) );
ซึ่งต่อจากนี้ไปครับถึง จะค่อยๆเริ่มเข้าเรื่อง ซึ่งๆกำลังจะเขียนต่อไป (แต่หมดแรงซะก่อน
#Focus to Business Logic Layer #
แล้วจะย้อนกลับไปตอบคำถาม ที่ได้ ผ่านๆ มาครับ
ทั้งของคุณ Sand King ,คุณ
เหมือนเป็น Step Step ไป เลยต้องขอโทษด้วยว่า อาจจะเขียนไปได้ช้าอะ
2)เกี่ยวกับเรื่องการแบ่ง layer โดยปกติส่วนใหญ่แล้วใช้การแบ่งแบบนี้
[ PL ]--reference --> [BLL]--reference -->[DAL]
เลยอยากจะถามว่า...
ส่วนของ DAL นี้จะรู้จักโครงสร้างข้อมูล ที่ BLL (หรือ PL) โยนมาให้ได้อย่างไร
อย่างเช่นโยน object Customer เข้ามา ให้ DAL ทำหน้าที่เก็บลง database
ตัว Entity Customer นั้นจะอยู่ที่ layer ไหน แล้วถ้าเกิดว่ามีการนำ O/R Mapping (LINQ, EF) มาใช้
จะนำมาใช้ทดแทนได้อย่างไร เพื่อให้สามารถโยนขึ้นไปถึง presentation layer ได้
- อันนี้ผมไม่รู้จะตอบยังไงดี ผมยังไม่ได้ LINQ to SQL , กับ EF เลย ท่านอื่นมีข้อเสนอเลยครับช่วยๆกัน
แต่เอามุมมองผมก่อนละกัน ..
LINQ to SQL /EF (EF นี่ผมยังไม่ได้ลองดูหลักการใช้อะ)
ผมมองว่า มันมีการทำงานในลักษณะ Data-Driven คือ เราต้องออกแบบ DataBase ก่อนแล้วก็ใช้ LINQ gen ออกมา
ได้เป็น Class( Entity ) ใช่ใหมครับ แล้วก็เอา Class พวกนี้ไปใช้
ถ้าเป็นแบบนี้ผมเลยมองว่ามันเป็นแค่ 2- Layer อะ
PL--->DAL
ทำไมผมจึงคิดแบบนี้ ???
ก็วันนึงผมไม่ใช้ LINQ แล้ว เปลี่ยนไปใช้อย่างอื่นหละ???
Entity Class พวกนี้จะยังคงใช้ได้อยู่ใหม ???
ส่วนการคำนวณและข้อกำหนด ต่างๆ (Business Logic)
มันก็จะไปอยู่ปนกันที่ทั้ง 2 Layer
ASP.NET (PL) LINQ to SQL(DAL)
------------- -----------------
*.aspx.cs ------เรียกใช้-------> Class(Entity)
+ Business Logic + Business Logic
-------------- ------------------
แบบนี้ก็จะตอบข้อนี้ได้เลยว่า ตัว Entity Customer นั้นจะอยู่ที่ layer DAL ครับ
แล้วถ้า 3-Layer จะเป็นยังไง
ASP.NET (PL) Business Logic(BLL) LINQ to SQL(DAL)
------------- ----------------- -----------------
*.aspx.cs ---> Class พวก Manager ---> Class(Entity มีแต่ data)
(มีแต่ Method
แล้วเรียกใช้ Entity อีกที)
-------------- -------------------- ------------------
แบบนี้มันจะเป็นการเขียน Procedural Progamming Style ที่เราคุ้นเคยกันครับ
ซึ่งเรียกว่า Anemic Domain Model
และ Entity จาก LINQ to SQL มันก็จะเป็น แบบ Single Domain Model ไป
แต่ที่ผมจะเขียน จะเป็นลักษณะ Domain-Driven Design
และเป็นแบบ Rich Domain Model ซึ่งจริงๆ มันคนละ Concept กับ Layer ต่างๆ
ที่ผมได้เขียนไปแล้ว 555+
ปล. คำศัพท์พวกนี้ ยังไม่อธิบายนะครับ ตอนแรกกะว่าจะยังไม่พูดถึง ^^
|
|
tapeza555 |
วันที่ส่ง: 27 พ.ค. 52 12:16 GMT+7 วันที่ปรับล่าสุด: 27 พ.ค. 52 12:16 GMT+7 |
Interface
|
|
tapeza555 |
วันที่ส่ง: 27 พ.ค. 52 12:39 GMT+7 วันที่ปรับล่าสุด: 27 พ.ค. 52 12:39 GMT+7 |
|
|
Nine (นาย) |
วันที่ส่ง: 27 พ.ค. 52 13:35 GMT+7 วันที่ปรับล่าสุด: 27 พ.ค. 52 13:35 GMT+7 |

public partial class _Default : PageBase {
protected void Page_Load( object sender, EventArgs e ) {
if(!Page.IsPostBack ){
IOrderDao orderDao = base.DaoProvider.GetOrderDao();---> ตรงนี้ก็ Return เป็น Interface IOrderDao
gvOrder.DatasSource = orderDao.GetAll();
gvOrder.DataBind();
}
}
}
|
|
tapeza555 |
วันที่ส่ง: 2 มิ.ย. 52 15:49 GMT+7 วันที่ปรับล่าสุด: 2 มิ.ย. 52 15:49 GMT+7 |
|
|
Caos |
วันที่ส่ง: 2 มิ.ย. 52 23:50 GMT+7 วันที่ปรับล่าสุด: 2 มิ.ย. 52 23:50 GMT+7 |
|
|
tapeza555 |
วันที่ส่ง: 2 มิ.ย. 52 23:56 GMT+7 วันที่ปรับล่าสุด: 2 มิ.ย. 52 23:56 GMT+7 |
|
|
notarry |
วันที่ส่ง: 3 มิ.ย. 52 22:39 GMT+7 วันที่ปรับล่าสุด: 3 มิ.ย. 52 22:39 GMT+7 |
จะว่างอะไรไหม ผมไม่อยากให้กระทู้นี้จากหายไปเลย
|
|
เฮียอ้วน |
วันที่ส่ง: 9 มิ.ย. 52 17:25 GMT+7 วันที่ปรับล่าสุด: 9 มิ.ย. 52 17:25 GMT+7 |
แต่ละกระทู้ รู้สึกว่าจะมีอายุ 365 วัน (1 ปี) ต้องเก็บ link เอาเองแล้วคร๊าบ...

|
|
nano |
วันที่ส่ง: 9 มิ.ย. 52 19:50 GMT+7 วันที่ปรับล่าสุด: 9 มิ.ย. 52 19:50 GMT+7 |
|
|
notarry |
วันที่ส่ง: 9 มิ.ย. 52 22:26 GMT+7 วันที่ปรับล่าสุด: 9 มิ.ย. 52 22:26 GMT+7 |
แต่ถ้าอ่าน Reply เฉพาะ ชองผม นะ เรื่องจะไม่ค่อยโดดไปนู่นไปนี่มากอะ
ซะงั้น ก็อยากจะลองทำโปรเจ็ก เล่นๆดู
My Learning (^_^) --> GreatFriendsProject
จะดีใหม ถ้า GF มี ให้เขียน Blog ^^
จะดีใหม ถ้า GF มี Lismania แบบใน
http://greatfriends.biz/files/VT10-OOADCaseStudy-SuthepS.pdf
จะดีใหม ถ้า web สอน dotnet ใช้ dotnet พัฒนา
เช่น
GF use MVC Design(*-* ยากเกิ้น
)
,GF use jQuery
,GF use Silverlive
,GF Theme selection
,GF Localize
,GF Application Architecture Design
,GF use Web 2.0 Design
,GF Live Demo
- คนอยากทำ Webbord ก็ อยากทำ Web board แบบ GF ทำยังไง ??
- ใช้ FCKeditor และอื่นๆ.. ทำยังไง
แต่คงต้องใช้ความรู้เยอะแฮะ ตอนนี้ยังมีไม่พอ
แต่คืออยากศึกษาพวก jQuery,ASP.NET ,EF,LINQ
ต้องศึกษา Web 2.0 ,Css เพื่อ ให้ รองรับ IE,FF ..อื่นๆ
ไหนจะต้องออกแบบให้มัน สวยดูดี ใช้ง่าย*-*
GF Domain Model
GF---->Forums
GF---->Courses
GF---->Blogs
GF---->Articles
นี่ก็ว่าทำเล่นๆ ถ้าว่างก็จพะลองทำ แต่รู้สึกจะยุ่งตลอด 
===========================================
ไปไหนซะไกลเลย...เอ้ากลับมาเข้าเรื่อง ที่คุณ Jericho ได้ถามไว้ดีกว่า
Service Layer(SL) (ต่อ)
4-Layer (3-Layer + Service Layer )
PL---->SL----->BLL<-----DAL
| ^
|______________|
มาตอบคำถามต่อ
Jericho :
REPLY #40 (106723)
ผมเคยอ่านเจอว่า เราสามารถที่จะใช้ Service Layer จัดการในเรื่อง Transaction
และเรียกใช้ Business Object ต่าง ๆ เพื่อลดจำนวนที่ call จาก PL มาที่ Server
โดยใช้ Facade Pattern มาช่วย แล้วใช้ DTO รับส่งระหว่าง Layer
1) Facade Pattern
2) DTO
3) Transaction
จากที่ได้เห็น Jericho ถามก็พอจะรู้เลยว่าคุณ กำลังศึกษา
Patterns of Enterprise Application Architecture (PoEAA)
1) สำหรับ Facade Pattern (Design Pattern ของ GOF) ผมว่าที่พี่ Sand King ได้อธิบายไว้ใน REPLY #41 (106733)
เห็นภาพดีครับ
"Facade Pattern คือ Class ที่เอางานย่อยๆ มายำรวมกัน" + เพื่อให้ Client เรียกใช้ง่ายขึ้น
ไม่ต้องไปรู้รายละเอียดการเรียกใช้ให้ยุ่งยาก (Encapsulation )
แต่เนื่องจากที่คุณ Jericho กำลังศึกษาคือ PoEAA ดังนั้น Facade ตัวนี้ คงหมายถึง Remote Facade
นั่นคือ ประยุกต์ Facade Pattern ของ GOF เพื่อเอามาใช้ในกรณี ที่มีการเรียก ข้าม Network
เพื่อช่วยในเรื่อง ของ Performance แบบที่คุณเข้าใจแหละครับ คือ ลดจำนวนครั้งในการเรียกให้น้อยลง
ซึ่งตรงนี้จริงๆ ผมมองว่าอาจจะเป็นอีก Layer นึง ที่มาครอบ Service Layer หรืออื่นๆ ก็ได้เพื่อ ช่วยในเรื่อง Remote Call ข้าม Network
2) สำหรับ DTO (Data Transfer Object )
-->เป็น Class ที่ไม่ต้องมี Business Logic มีแต่ Property ,Field ซึ่งส่วนใหญ่ที่เราทำๆ กันก็จะเป็นแบบนี้
แล้วเอา Class Service ที่มีแต่ Method (ที่มี Business Logic ) มาเรียกใช้ มันอีกที
อันนี้ คงแล้วแต่คนใช้มั้งครับ ตามใน PoEAA ก็จะใช้ร่วมกับ Remote Facade
สำหรับบางคนก็แปลง Domain เป็น DTO เพื่อให้มา Map กับการ Design หน้า UI
3) สำหรับ Transaction ผมก็ว่าน่าจะไว้ที่ SL นี่แหละครับ แต่ก็ยังไม่เก่งเรื่องการวาง
Trasaction เอาซะเลย ท่านพอจะแนะนำได้ใหมครับ
ยิ่ง Pattern UnitOfWork นี่ก็ยังงงๆๆ เลยถ้าเขียน มันต้องทำยังไง เศร้าใจกับชีวิตเจงๆๆ

|
|
tapeza555 |
วันที่ส่ง: 10 มิ.ย. 52 15:53 GMT+7 วันที่ปรับล่าสุด: 10 มิ.ย. 52 15:53 GMT+7 |
|
|
Nine (นาย) |
วันที่ส่ง: 10 มิ.ย. 52 17:10 GMT+7 วันที่ปรับล่าสุด: 10 มิ.ย. 52 17:10 GMT+7 |
|
|
Nine (นาย) |
วันที่ส่ง: 10 มิ.ย. 52 17:14 GMT+7 วันที่ปรับล่าสุด: 10 มิ.ย. 52 17:14 GMT+7 |
ขอบคุณพี่นายมากๆครับ ผมก็เห็นด้วยกับพี่นายเลยครับ การจะวาง Transaction นี่

|
|
tapeza555 |
วันที่ส่ง: 22 มิ.ย. 52 09:28 GMT+7 วันที่ปรับล่าสุด: 22 มิ.ย. 52 09:28 GMT+7 |
|
|
aekram43 |
วันที่ส่ง: 22 มิ.ย. 52 10:57 GMT+7 วันที่ปรับล่าสุด: 22 มิ.ย. 52 10:57 GMT+7 |
|
เรียน .NET/OOAD กับ อ.สุเทพ (surrealist) Microsoft Most Valuable Professional (MVP): |
![]() ลงทะเบียนเรียน |