โครงการหนังสือ ASP.NET 2.0 ฟรีสำหรับโรงเรียน
แจกไปหมดแล้ว 15 เล่มครับ
Event ดีที่ยำใหญ่หลายหัวข้อครับ วันอาทิตย์ที่ 15 มกราคม 2012 นี้แล้วครับ อาจจะโพสต์ช้าไปหน่อย ใครสนใจดูได้ที่นี่ครับ http://www.facebook.com/events/317882901567092/
ผมใช้ asp.net (c#) สร้าง Web App ขึ้นมาหน้านึง ในหน้านั้น ส่วนสำคัญคือ มี Textbox1 ที่เป็น Multiline Mode แล้วใช้ StreamReader อ่านไฟล์ TextFile1.txt เข้าไป แล้วผมได้สร้าง Button1 ที่มี eventClick ให้นำตัวอักษรใน TextBox1 กลับไปเข้าไปเขียนใน TextFile1.txt ใหม่ แต่ติดปัญหาที่ว่า ตอนจะเอาข้อความกลับเข้าไปเซฟไว้ที่ไฟล์เดิม กลับไม่มีอะไรเกิดขึ้นเมื่อกดเซฟ อยากให้ ผู้รู้ช่วยหาข้อผิดพลาดให้ทีครับ
Code
protected void Page_Load(object sender, EventArgs e)
{
this.WLoad();
}
public void WLoad()
TextBox1.Text = ""; //เคลีย textbox
StreamReader hiko = new StreamReader("/workWEB/TextFile1.txt");
TextBox1.Text = hiko.ReadToEnd ();
hiko.Close();
// เมื่อ page_load ก็จะนำค่าจาก textfile1.txt ไปใส่ไว้ใน textbox1
protected void Button1_Click(object sender, EventArgs e)
{ StreamWriter hk = new StreamWriter("/workWEB/TextFile1.txt",false );
hk.Write(TextBox1.Text);
hk.Close();
hk.Dispose();
//เมื่อกด button1 จะนำค่าจาก Textbox1 กลับไปเขียนลงในไฟล์ โดยการ overwrite
แต่พอลองใช้งานดูเมื่อเปิดเวป จากนั้นลองแก้ข้อความลงใน Textbox1 แล้วทำการกด button1 เพื่อ save ข้อมูลกลับไปใน textfile1.txt กลับไม่มีอะไรเกิดขึ้น อยากให้ผู้รู้ช่วยชี้ทางด้วยครับ
เป็นเพราะตอนเรากดปุ่มเพื่อเซฟ ก็จะเกิดการ postback กลับไปที่เซิร์ฟเวอร์
หลังจากนั้นเหตุการณ์ Page_Load จะเกิดขึ้นก่อน Button1_Click สังเกตุว่าเราโหลดค่าจาก Text file กลับมาเหมือนเดิมในโพรซีเยอร์ WLoad ที่ถูกเรียกอยู่ใน Page_Load
หลังจากนั้นจึงไปเรียก Button1_Click เพื่อเซฟ ก็เลยกลายเป็นเราเซฟข้อความเดิม ก็เลยไม่เห็นอะไรเปลี่ยนแปลง วิธีการแก้คือเราต้องเพิ่ม logic ตรวจสอบว่าการเรียกเข้ามาที่ Page_Load นั้นเป็นการเปิดหน้าเว็บครั้งแรกหรือเปล่า
ถ้าใช่ก็ไปเรียก WLoad() ตามปกติ แต่ถ้าไม่ใช่ จะเป็นการ postback ซึ่งเกิดจากตอนกดปุ่มเพื่อเซฟ ซึ่งกรณีนี้เราไม่ต้องไปเรียก WLoad() ครับ
ให้แก้ไขโค้ดเล็กน้อยดังนี้
protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { this.WLoad(); } }
nas wrote
ขอบคุณมากครับผมจะลองทำตามดูครับ แสดงว่าผมต้องศึกษาเรื่องพฤติกรรมที่แตกต่างระหว่าง asp.net กับ app ธรรมดาให้มากขึ้นขอบคุณมากครับ
มารายงานผลครับ
ใช้งานได้แล้วครับขอบคุณมากติดปัญหานี้อยู่หลายวันจนงานไม่เดิน
ขอบคุณที่ชี้ทางสว่างให้ครับ เหมือนยกภูเขาออกจากอกเลยครับ
ขอบคุณ คุณ nas มากๆครับ ต่อจากนี้จะมาคอยตามดูเวปนี้สม่ำเสมอครับ ถ้ามีกิจกรรมดีๆในวันข้างหน้าก็บอกกันด้วยนะครับ