 |
|
ทดสอบความทรงจำ ASP.NET Repeater ข้อมูลมันจะหายไปเมื่อ PostBack (Item.DataItem IS NULL) |
|
 |
|
|
 |
 |
|
ผมถามไปส่งเดชอย่างนั้นแหละครับ (ผมมีคำตอบในใจอยู่แล้ว)
ปล. ผมมีอีก หมื่นแสนพันร้อย คำถาม และผมมั่นใจว่า ไม่มีใครตอบผมได้แม้แต่คนเดียว(จริงหรือเปล่า?ป
|
ประวัติการแก้ไข 2014-09-05 16:21:42
 |
 |
 |
 |
Date :
2014-09-05 16:20:37 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
สรุปว่า ในเมืองไทยนี้ ไม่มีใครตอบผมได้ใช่ไหม?
---
ปล. โดนด่าเละแน่ตรู่...
|
 |
 |
 |
 |
Date :
2014-09-05 16:48:18 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ผมมาขอฟังอย่างเดียวละกันครับ
|
 |
 |
 |
 |
Date :
2014-09-16 11:08:16 |
By :
patzy |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
คำถามไม่ชัด ไม่มีใครตอบได้หรอก
โดยปกติถ้า postback ธรรมดา repeater item ไม่มีทางหายหรอก
ยกเว้น item เหล่านั้นจะถูกสร้างขึ้นแบบ dynamic พอมีการ postback อีกครั้ง
method ที่ใช้สร้าง item เลยไม่ได้ถูกเรียกใช้ มันเลยไม่ได้ถูกสร้างขึ้นมาใหม่
วิธีแก้ก็คือ
- ajax
- viewstate
ปล.ปัญหานี้มักจะเจอกับพวกอ่อนหัดที่ไม่รู้จัก page life cycle เท่านั้น
ไม่รู้ก็บอกไม่รู้ ไม่ต้องมาฟอร์มเดี๋ยวจะสอนให้เอง
|
 |
 |
 |
 |
Date :
2014-09-16 14:15:00 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
What happend!!!
Code (JavaScript)
<html lang="lao-girl">
<head id="Head1" runat="server">
<title>คันหูไม่รู้เป็นอะไร เอาอะไรมาแหย่ก็ไม่หาย</title>
</head>
<body>
<form id="form1" runat="server">
<script type="text/javascript">
function callbackGetData(arg) {
setTimeout("<asp:literal runat="server" id="ltrCallback" />", 1500);
}
</script>
</form>
</body>
</html>
ปล. การเขียน JavaScript แทรกใน Tag Head และใน Tag Body ผลลัพธ์ที่ได้มันไม่เหมือนกัน งงเหมือนกันครับ
|
ประวัติการแก้ไข 2014-09-17 06:06:13 2014-09-17 06:09:49
 |
 |
 |
 |
Date :
2014-09-17 06:05:19 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตอบความคิดเห็นที่ : 4 เขียนโดย : ห้ามตอบเกินวันละ 2 กระทู้ เมื่อวันที่ 2014-09-16 14:15:00
ผมอยากเดินทางอื่นบ้างนอกเหนือจาก
1. Jquery Ajax
2. MS Ajax (AJAX Extentions)
3. JavaScript เพียวฯ
มันเลยกลายมาเป็นแบบนี้ครับ
Code (VB.NET)
Public Class CallBack2Client2Server
Inherits System.Web.UI.Page
Implements ICallbackEventHandler
Public Function GetCallbackResult() As String Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult
Return _CallbackValue
End Function
Public Sub RaiseCallbackEvent(eventArgument As String) Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent
Using sw As New System.IO.StringWriter()
GridView.RenderControl(New HtmlTextWriter(sw))
_CallbackValue = sw.ToString()
End Using
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsCallback Then
ltrCallback.Text = ClientScript.GetCallbackEventReference()
End If
End Sub
End Class
ปล. เท่าที่ลองดูในเบื้องต้น มันทำงานได้เร็วกว่าการใช้ UpdatePanel (AJAX Extensions) อยู่พอสมควร
และความเร็วที่ได้ไม่แตกต่างกับ Jquery Ajax
***** เน้นว่า เท่าที่ลองดูในเบื้องต้น
|
ประวัติการแก้ไข 2014-09-17 06:22:05 2014-09-17 06:22:54 2014-09-17 06:39:32
 |
 |
 |
 |
Date :
2014-09-17 06:18:19 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
Code
เปลี่ยนมา mvc ดีกว่า
อันนี้น่าสนใจครับ เมื่อถึงปี ค.ศ. 2022 ค่อยว่ากันอีกทีหนึ่งครับ (ถ้าผมไม่ตายห่าไปเสียก่อน)
อีกอย่าง javascript มันรัน server control ได้ด้วยเหรอ ???
ลองดูครับ (ผมงงงงกับมันอยู่เหมือนกัน)
Code (VB.NET)
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="CallBack2.aspx.vb" Inherits="หอย.CallBack2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>คันหูไม่รู้เป็นอะไร เอานิ้วแหย่มันก็ไม่หาย</title>
</head>
<body>
<form id="form1" runat="server">
<div id="grid">
<span>Loading...</span>
<asp:GridView runat="Server" ID="gvคันหู" Width="400px" />
</div>
<script type="text/javascript">
function EndGetData(arg) {
document.getElementById("grid").innerHTML = arg;
}
//http://stackoverflow.com/questions/2004168/javascript-escape-quotes
setTimeout("<asp:literal runat="server" id="ltCallback" />", 5000);
//มันแอบไปสร้าง Control ใน Callback2.designer.vb เฉยเลยครับ
</script>
</form>
</body>
</html>
Code (VB.NET)
Public Class CallBack2
Inherits System.Web.UI.Page
Implements ICallbackEventHandler
Private _Callback As String
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsCallback Then
ltCallback.Text = ClientScript.GetCallbackEventReference(Me, "'bindgrid'", "EndGetData", "'gvคันหู'", False)
End If
End Sub
Private Function RetrieveDataTableFromDatabase() As DataTable
Dim t As New DataTable()
t.Columns.Add("Product", GetType(String))
t.Columns.Add("Price", GetType(Single))
t.Rows.Add("ปลากระป๋องตราสามหอย", 1500)
t.Rows.Add("อดสองมื้ออิ่มหนึ่งมื้อ", 100)
t.Rows.Add("ไม่ใช่แฟนเราก็ทำแทนได้", 3)
Return t
End Function
Public Function GetCallbackResult() As String Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult
Return _Callback
End Function
ปล. ตัวอย่างดัดแปลงมาจาก ที่นี่ครับ
***** http://madskristensen.net/post/asynchronous-gridview-in-5-simple-steps
|
 |
 |
 |
 |
Date :
2014-09-17 10:29:26 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
จาก #NO 8 ผมเอามาใช้งานอีกแบบหนึ่งครับ
อันนี้คือตัวอย่าง (งานจริงฯ ผมไม่ได้เรียกใช้ Web Service แต่ก็มีปะปนอยู่บ้างเหมือนกัน)
อันนี้เพียงแต่ยกตัวอย่างประกอบ
Code (JavaScript)
function IC_getDoc_NO(gv) {
//console.log('ปลากระป๋องตรา สามหอย.');
// var params = {
// id: $('#ID').val(),
// name: $('#Name').val(),
// add1: $('#Add1').val()
// }
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: "LookupIC.asmx/GetCarsByDoors",
data: "{doors: " + 7 + "}",
dataType: "json",
success: function (response) {
var cars = response.d;
//var gridviewASPdotNET = $('#' + gv + ' tr:has(td)'); //แบบนี้มันก็หา td ไม่เจอ งงเหมือนกันครับ
$('form').find('#' + gv + ' tr:has(td)').each(function () {
var cell = $(this).find("td:eq(0)").text().toLowerCase();
if (cell.indexOf('a') != 0) {
$(this).css('display', 'none');
} else {
$(this).css('display', '');
}
});
},
});
}
ปล. งานจริงผมส่งค่าออกไปประมาณนี้ครับ JsonConvert.SerializeObject(objData)
Code (VB.NET)
<input id="btnFilterXXX" type="button" value="กรองข้อมูล (ขึ้นต้นด้วย A)" onclick="return IC_getDoc_NO('<%= gvrptFormat.ClientID %>');" />
|
ประวัติการแก้ไข 2014-09-17 10:44:33 2014-09-17 10:45:17
 |
 |
 |
 |
Date :
2014-09-17 10:40:10 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
หนามยอกเอาหนามบ่ง " Item.DataItem IS NULL (อยากหายก็หายไปเลย)"
ใช้ประโยชน์จากอีเวนต์ ItemCommand (มันทำครั้งเดียวเท่านั้นตอนที่ Binding)
Code (VB.NET)
'มันเข้าครั้งเดียวตอน Binding
Protected Sub หอย_ItemCommand(source As Object, e As System.Web.UI.WebControls.RepeaterCommandEventArgs) Handles หอย.ItemCommand
Select Case e.CommandName
Case "Add"
For Each item As RepeaterItem In หอย.Items
Dim cb As CheckBox = item.FindControl("cbหอย")
If cb.Checked Then
'tmpKey, tmpValue
cb.Attributes.Add("tmpKey", True)
'เอาค่านี้แหละไปเทใส่อีกครั้งหนึ่งใน อีเวนต์ หอย_ItemCreated
End If
Next
End Sub
'มันเข้ามาทุกครั้งที่ PostBack
Private Sub หอย_ItemCreated(sender As Object, e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles หอย.ItemCreated
If ((e.Item.ItemType = ListItemType.Item) OrElse (e.Item.ItemType = ListItemType.AlternatingItem)) Then
Dim cb As CheckBox = item.FindControl("cbหอย")
cb.Checked = cb.Attributes("tmpKey") 'น่าจะมองภาพออกนะครับ ในกรณีที่ยังไม่ได้คำตอบที่พึงพอใจ +55555
End If
End Sub
จบบริบูรณ์
|
ประวัติการแก้ไข 2014-09-17 16:49:34
 |
 |
 |
 |
Date :
2014-09-17 16:47:32 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|

|
 |
 |
 |
 |
Date :
2014-09-17 17:10:54 |
By :
mr.win |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|