ในโครงการปัจจุบัน มีส่วนการค้นหา จำเป็นต้องแสดงฟิลด์ในตารางผลลัพธ์การค้นหาเพื่อให้ผู้ใช้สามารถเลือกได้
ดังนั้นจึงมีการใช้กล่องรายการสองรายการเพื่อแสดงรายการฟิลด์ที่สามารถแสดงได้ทั้งหมดและฟิลด์ที่แสดงที่เลือกตามลำดับ
และใช้ js ใน เบื้องหน้าเพื่อควบคุมรายการระหว่างกล่องรายการทั้งสอง เพิ่ม ลบ และย้าย
(ไม่มีทาง ทดสอบ mm บอกว่าเหตุการณ์เบื้องหลังรีเฟรชแล้วดูอึดอัด...)
เลยสร้างปุ่ม html ขึ้นมา 2 ปุ่ม
กิจกรรมมีดังนี้: (ไม่ต้องกังวลกับ Hidden1 ในตอนนี้)
การทดสอบฟังก์ชัน (lbFieldsSelect, ค่า)
-
สำหรับ (j = 0;j
ถ้า (lbFieldsSelect.options[j].value == value) คืนค่าเป็นจริง
-
กลับเท็จ;
-
ฟังก์ชั่น SelectField()
-
var lbFields = document.getElementById("lbFields");
var lbFieldsSelect = document.getElementById("lbFieldsSelect");
var Hidden1 = document.getElementById("Hidden1");
สำหรับ (i = 0;i
ถ้า (lbFields.options[i].selected)
-
ถ้า (ทดสอบ (lbFieldsSelect,lbFields.options[i].value))
-
//เลือกช่องแล้ว
ดำเนินการต่อ;
-
lbFieldsSelect.options.add(document.createElement("ตัวเลือก"));
lbFieldsSelect.options[lbFieldsSelect.length-1].text=lbFields.options[i].text;
lbFieldsSelect.options[lbFieldsSelect.length-1].value=lbFields.options[i].value;
Hidden1.value = Hidden1.value + "#" + lbFields.options[i].text + "@" + lbFields.options[i].value;
-
-
-
ฟังก์ชั่น UnSelectField()
-
var lbFields = document.getElementById("lbFields");
var lbFieldsSelect = document.getElementById("lbFieldsSelect");
var Hidden1 = document.getElementById("Hidden1");
สำหรับ (i = 0;i
ถ้า (lbFieldsSelect.options[i].selected)
-
lbFieldsSelect.options.add(document.createElement("ตัวเลือก"));
lbFieldsSelect.options[lbFieldsSelect.length-1].text=lbFields.options[i].text;
lbFieldsSelect.options[lbFieldsSelect.length-1].value=lbFields.options[i].value;
Hidden1.value = Hidden1.value + "#" + lbFields.options[i].text + "@" + lbFields.options[i].value;
-
-
-
โดยไม่คาดคิดเมื่อส่งไปยังพื้นหลัง ListItem ที่เพิ่มในแผนกต้อนรับก็หายไป เมื่อคิดอย่างรอบคอบแล้ว จะต้องเป็นว่า asp.net ไม่ได้เพิ่ม ViewState หลังจากการเปลี่ยนแปลงของไคลเอนต์กล่องรายการเมื่อโพสต์กลับ
ในความเป็นจริงคุณไม่สามารถตำหนิ ms ได้แม้แต่ตารางก็ไม่มี ViewState (ตามข้อมูลของ ms ตารางนั้นเป็นเพียงคอนเทนเนอร์และจำเป็นสำหรับตัวควบคุมในตารางเพื่อรักษา ViewState)
ListBox ซึ่งเป็นสิ่งที่ลูกค้าไม่ค่อยได้รับการเปลี่ยนแปลงนั้นไม่จำเป็นอีกต่อไป ฉันไม่มีทางเลือกอื่นนอกจากสร้างบางสิ่งที่สามารถรักษา viewstate เพื่อใส่รายการต่างๆ ลงใน listBox ได้ ดังนั้นฉันจึงมี
โค้ดที่เกี่ยวข้องบนฝั่งเซิร์ฟเวอร์ Hidden1 ข้างบน:
โมฆะส่วนตัว RestorelbFieldsSelect ()
-
string[] sField =Hidden1.Value.Split('#');
//lstShowField.Items.Clear();
DataTable dtField = DataTable ใหม่ ();
dtField.Columns.Add("sDisplayName","".GetType());
dtField.Columns.Add("sFieldName","".GetType());
สำหรับ (int i = 0 ; i < sField.Length ; i ++)
-
ถ้า (sField[i] == null || sField[i] == "") ดำเนินการต่อ;
แถวข้อมูล = dtField.NewRow();
แถว[0] = sField[i].แยก( '@')[0 ];
แถว[1] = sField[i].แยก( '@')[1 ];
dtField.Rows.Add(แถว);
-
lbFieldsSelect.DataSource = dtField;
lbFieldsSelect.DataTextField = "sDisplayName";
lbFieldsSelect.DataValueField = "sFieldName";
lbFieldsSelect.DataBind();
-
ในกรณีนี้ ListBox จะถูกอัพเดตตามสถานะที่ซ่อนอยู่ทุกครั้งที่โหลดเพจ
เป้าหมายของโครงการของเราบรรลุเป้าหมายแล้ว (ต้องการเพียงรายการของกล่องรายการเท่านั้น ไม่จำเป็นต้องพิจารณาการเลือก ฯลฯ )
หากคุณต้องการประมวลผลรายการที่เลือก คุณอาจต้องซ่อนรายการอื่น
http://www.cnblogs.com/calmzeal/archive/2006/07/26/460068.html