摘要:[習題]動態新增 DropDownList或 ListBox底下的新項目(Item)#2 [左右搬移](單選 / 複選)簡單版
書本 上集(第三章)的小範例
[習題]動態新增 DropDownList或 ListBox底下的新項目(Item)#2 [左右搬移](單選)
http://www.dotblogs.com.tw/mis2000lab/archive/2008/12/01/listbox.item_add_remove.aspx
上面這個範例已經收錄在 ASP.NET 4.0 / 4.5 專題實務(上集 第三章,松崗出版)
ListBox改成「複選」以後,會出狀況。
昨天上課時,有兩位學員提供了建議
修正後更簡單,程式碼更少、更直覺了。
感謝 2012/10/7 (週日班)的學員熱情分享與指正。
三人行,必有我師。
原本的程式(改良以後,有些部分刪除)
2012/1/7補充:下面這個範例,以前在 ListBox設定為「複選」時,
VB語法 會出現錯誤。錯誤原因如同下面所言。
但是在 C# 則可執行,但點選相鄰的兩個子選項,會出現錯誤結果。
===================================================
protected void Button1_Click(object sender, EventArgs e)
{ //== 右移 ==
int a = 0;
if (ListBox2.Items.Count == 0)
Response.Write("<Script Language=\"JavaScript\">window.alert(\"警告!ListBox1已經沒有子選項\");</Script>");
for (int i = 0; i < ListBox1.Items.Count; i++)
{
if (ListBox1.Items[i].Selected)
{
ListBox2.Items.Add(ListBox1.Items[i].Text);
a = a + 1;
ListBox1.Items.Remove(ListBox1.Items[i].Text);
//==被搬移走了,這個子選項就該移除!
//** 中間的子選項突然變少(臨時被移走),所以迴圈次數又少一個,因此報錯!
}
}
if (a == 0) {
Label1.Text = "<font color=red>警告!您未點選任何一個子選項</font>";
}
else {
Label1.Text = "<font color=blue>移動成功</font>";
}
Label2.Text = "";
}
protected void Button2_Click(object sender, EventArgs e)
{ //== 左移 ==
int b = 0;
if (ListBox2.Items.Count == 0)
Response.Write("<Script Language=\"JavaScript\">window.alert(\"警告!ListBox2已經沒有子選項\");</Script>");
for (int j = 0; j < ListBox2.Items.Count; j++)
{
if (ListBox2.Items[j].Selected)
{
ListBox1.Items.Add(ListBox2.Items[j].Text);
b = b + 1;
ListBox2.Items.Remove(ListBox2.Items[j].Text);
//==被搬移走了,這個子選項就該移除!
//******************************
//** 中間的子選項突然變少(臨時被移走),所以迴圈次數又少一個,因此報錯!
}
}
if (b == 0) {
Label2.Text = "<font color=red>警告!您未點選任何一個子選項</font>";
}
else {
Label2.Text = "<font color=green>移動成功</font>";
}
Label1.Text = "";
}
原本的程式,有幾個缺失:
第一,改成「複選」以後會出錯
後續雖有改正,但程式碼冗長不佳。
主要的錯誤,在於移動子選項之後(.Add()或是 .Remove()),ListBox裡面的子選項數目(.Items.Count)減少,造成 Index索引數出錯!(VB語法會報錯,C#不會。但C#運作結果不正常)
第二,移動的子選項(ListItem),其 Text與 Value會相同。
如果改用 New ListItem來作,好像對初學者來說,程式碼了些,又難了一點點
之前的改良程式 在此 ---- www.dotblogs.com.tw/mis2000lab/archive/2012/02/13/listbox_multiitem_add_remove.aspx
改良後的程式 (C#)
===================================================
protected void Button1_Click(object sender, EventArgs e)
{ //== 右移 ==
int a = 0;
if (ListBox2.Items.Count == 0)
Response.Write("<Script Language=\"JavaScript\">window.alert(\"警告!ListBox1已經沒有子選項\");</Script>");
//**********************************************************
//*** 改用反迴圈(由大到小)來執行,即可。
//**********************************************************
for (int i = (ListBox1.Items.Count-1); i >=0 ; i--)
{
if (ListBox1.Items[i].Selected)
{
ListBox2.Items.Add(ListBox1.Items[i]);
a++;
ListBox1.Items.Remove(ListBox1.Items[i]);
//==被搬移走了,這個子選項就該移除!
}
}
if (a == 0)
Label1.Text = "<font color=red>警告!您未點選任何一個子選項</font>";
else
Label1.Text = "<font color=blue>移動成功</font>";
Label2.Text = "";
}
protected void Button2_Click(object sender, EventArgs e)
{ //== 左移 ==
int b = 0;
if (ListBox2.Items.Count == 0)
Response.Write("<Script Language=\"JavaScript\">window.alert(\"警告!ListBox2已經沒有子選項\");</Script>");
//**********************************************************
//*** 改用反迴圈(由大到小)來執行,即可。
//**********************************************************
for (int j = (ListBox2.Items.Count-1); j >=0 ; j--)
{
if (ListBox2.Items[j].Selected)
{
ListBox1.Items.Add(ListBox2.Items[j]);
b++;
ListBox2.Items.Remove(ListBox2.Items[j]);
//==被搬移走了,這個子選項就該移除!
}
}
if (b == 0)
Label2.Text = "<font color=red>警告!您未點選任何一個子選項</font>";
else
Label2.Text = "<font color=green>移動成功</font>";
Label1.Text = "";
}
改良後的程式 (VB)
===================================================
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
'== 右移 ==
Dim a As Integer = 0
If ListBox1.Items.Count = 0 Then
Label1.Text = "<font color=red>警告!ListBox1已經沒有子選項</font>"
End If
'**********************************************************
'*** 改用反迴圈(由大到小)來執行,即可。
'**********************************************************
For i As Integer = (ListBox1.Items.Count - 1) To 0 Step -1
If ListBox1.Items(i).Selected Then '==判定哪一個子選項被點選了。
ListBox2.Items.Add(ListBox1.Items(i))
a = a + 1
ListBox1.Items.Remove(ListBox1.Items(i))
'==被搬移走了,這個子選項就該移除!
End If
Next
If a = 0 Then
Label1.Text = "<font color=red>警告!您未點選任何一個子選項</font>"
Else
Label1.Text = "<font color=blue>移動成功</font>"
End If
End Sub
Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
'== 左移 ==
Dim b As Integer = 0
If ListBox2.Items.Count = 0 Then
Label2.Text = "<font color=red>警告!ListBox2已經沒有子選項</font>"
End If
'**********************************************************
'*** 改用反迴圈(由大到小)來執行,即可。
'**********************************************************
For j As Integer = (ListBox2.Items.Count - 1) To 0 Step -1
If ListBox2.Items(j).Selected Then '==判定哪一個子選項被點選了。
ListBox1.Items.Add(ListBox2.Items(j))
b = b + 1
ListBox2.Items.Remove(ListBox2.Items(j))
'==被搬移走了,這個子選項就該移除!
End If
Next
If b = 0 Then
Label2.Text = "<font color=red>警告!您未點選任何一個子選項</font>"
Else
Label2.Text = "<font color=green>移動成功</font>"
End If
End Sub
還有哪些地方可以改進?
您可以發現兩個事件內的程式碼,幾乎有 90%雷同,能否繼續濃縮呢?
感謝 2012/10/7 (週日班)的學員熱情分享與指正。
三人行,必有我師。
把自己的範例分享出來,除了可以收集成書本出版、講課以外,
有更多高手看見了,還會指點我們
讓我們有機會學得更多、改得更好
是不是利己利人的好事呢....
我將思想傳授他人, 他人之所得,亦無損於我之所有;
猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。----Thomas Jefferson
線上課程教學,遠距教學 (Web Form 約 51hr) https://dotblogs.com.tw/mis2000lab/2016/02/01/aspnet_online_learning_distance_education_VS2015
線上課程教學,遠距教學 (ASP.NET MVC 約 140hr) https://dotblogs.com.tw/mis2000lab/2018/08/14/ASPnet_MVC_Online_Learning_MIS2000Lab
寫信給我,不要私訊 -- mis2000lab (at) yahoo.com.tw 或 school (at) mis2000lab.net
(1) 第一天 ASP.NET MVC5 完整影片(5.5小時 / .NET 4.x版)免費試聽。影片 https://youtu.be/9spaHik87-A
(2) 第一天 ASP.NET Core MVC 完整影片(3小時 / .NET Core 6.0~8.0)免費試聽。影片 https://youtu.be/TSmwpT-Bx4I
[學員感言] mis2000lab課程評價 - ASP.NET MVC , WebForm 。 https://mis2000lab.medium.com/%E5%AD%B8%E5%93%A1%E6%84%9F%E8%A8%80-mis2000lab%E8%AA%B2%E7%A8%8B%E8%A9%95%E5%83%B9-asp-net-mvc-webform-77903ce9680b
ASP.NET遠距教學、線上課程(Web Form + MVC)。 第一天課程, "完整" 試聽。
......... facebook社團 https://www.facebook.com/mis2000lab ......................
......... YouTube (ASP.NET) 線上教學影片 https://www.youtube.com/channel/UC6IPPf6tvsNG8zX3u1LddvA/
Blog文章 "附的範例" 無法下載,請看 https://dotblogs.com.tw/mis2000lab/2016/03/14/2008_2015_mis2000lab_sample_download
請看我們的「售後服務」範圍(嚴格認定)。
......................................................................................................................................................
ASP.NET MVC => .NET Core MVC 線上教學 ...... 第一天課程 完整內容 "免費"讓您評估 / 試聽
[遠距教學、教學影片] ASP.NET (Web Form) 課程 上線了!MIS2000Lab.主講 事先錄好的影片,並非上課側錄! 觀看時,有如「一對一」面對面講課。