iT邦幫忙

0

VB連續物件的值如何遞增代入

我的page1.aspx
有連續的物件Label1, Label2, Label3, ...
想在後端page1.aspx.vb
代入連續的值
Label1.text=1
Label2.text=2
Label3.text=3
...
請問如何用簡化?

2 個回答

1
神Q超人
iT邦新手 2 級 ‧ 2018-05-14 23:41:59
最佳解答

HI,我想可以用迴圈的方式,以下範例可以參考看看:
aspx:

<form id="form1" runat="server">
    <div>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
        <asp:Label ID="Label3" runat="server" Text="Label"></asp:Label>
        <asp:Label ID="Label4" runat="server" Text="Label"></asp:Label>
    </div>
    </form>

VB:

Private Sub page1_Load(sender As Object, e As EventArgs) Handles Me.Load
    '把所有要放值的label都放進陣列中
    Dim labelList() As Label = {Label1, Label2, Label3, Label4}
    '對應要放進每個label的值
    Dim strList() As String = {"1", "2", "3", "4"}
    '用迴圈放值
    For i As Integer = 0 To labelList.Length - 1
        labelList(i).Text = strList(i)
    Next

End Sub

順便給個C#:

    protected void Page_Load(object sender, EventArgs e)
    {
        //把所有要放值的label都放進陣列中
        Label[] labelList = {Label1,Label2,Label3,Label4 };
        //對應要放進每個label的值
        string[] strList = { "1", "2", "3", "4" };
        //用迴圈放值
        for(int i = 0; i <= labelList.Length - 1; i++)
        {
            labelList[i].Text = strList[i];
        }
    }
看更多先前的回應...收起先前的回應...

沒在寫vb, 但陣列應該用一個就可以做完,何必用兩個~
/images/emoticon/emoticon06.gif

因為我想說如果以後starcity1003大大要設定不同的值就可以直接用了/images/emoticon/emoticon37.gif
不然我在留言把他補上去好惹/images/emoticon/emoticon13.gif
VB:

Private Sub page1_Load(sender As Object, e As EventArgs) Handles Me.Load
    '把所有要放值的label都放進陣列中
    Dim labelList() As Label = {Label1, Label2, Label3, Label4}
    '用迴圈放值
    For i As Integer = 0 To labelList.Length - 1
        labelList(i).Text = (i+1).ToString()
    Next

End Sub

要設定不同的值,應該寫成function, 把labelList() As Label當作傳入參數,改成只要傳陣列進去,就可以動態產生多個label物件,不用寫死,甚至改成可以支援傳不同的html物件,Hard Code的寫法不大好~/images/emoticon/emoticon10.gif

嗚嗚,不好意思/images/emoticon/emoticon06.gif
「要設定不同的值,應該寫成function, 把labelList() As Label當作傳入參數,改成只要傳陣列進去,就可以動態產生多個label物件」這邊我應該還是懂,但是他這樣也要多一個放值的陣列,一起傳進那個function中嗎?

謝謝大家幫忙!

我沒有要動態產生物件唷!

我有固定的18個label, 要代入的值是資料庫產生的, 所以我主要是找不到遞增物件名稱如何在後端寫成迴圈或for each 代入text的值

陣列的方式很好,
不知道有沒有更簡潔的語法呢?
因為我還有其他類別的多個物件...

PS. 我不是要動態產生物件唷!

也可以試試看下面的程式碼:
aspx:

<form id="form1" runat="server">
    <div>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
        <asp:Label ID="Label3" runat="server" Text="Label"></asp:Label>
        <asp:Label ID="Label4" runat="server" Text="Label"></asp:Label>
    </div>
    </form>

VB:

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
            '因為有四個label 所以跑4次迴圈
            For i As Integer = 1 To 4
                '找出ID為label+i的物件
                Dim obj As Label = CType(Me.FindControl("Label" + i.ToString()), Label)
                '寫資料
                obj.Text = i.ToString()
            Next
    End Sub

如果有問題可以再告訴我/images/emoticon/emoticon41.gif

回應
"並未將物件參考設定為物件的執行個體"

首先要確認你有沒有使用MasterPage的頁面
可以參考看看:
https://dotblogs.com.tw/joysdw12/2011/02/16/21400

哦~!原來如此!
這個頁面我有找到過,不過現在才仔細看上面的說明^^"
我懂了!感恩!

不會ㄛ,加油/images/emoticon/emoticon12.gif

我試了還是一樣耶!
lbl = Me.Master.FindControl("ContentPlaceHolder1").FindControl("Label" & i)
ContentPlaceHolder1最後一個字母是123的1吧!這個字串變數是固定的嗎?

他不是固定的哦!你得確認一下你的MasterPage中的內容,看有沒有這個標籤<asp:ContentPlaceHolder></asp:ContentPlaceHolder>,像我的專案命名方式是這個:

<asp:ContentPlaceHolder ID="MainContent" runat="server"></asp:ContentPlaceHolder>

所以如果是我的label放在這個裡面的話,那程式碼要改成:
lbl = Me.Master.FindControl("MainContent").FindControl("Label" & i)
這樣才會正確

因為我還有其他類別的多個物件... 所以要寫成function 然後就可以要產生什麼類別的多個物件,就傳什麼陣列進去就解決啦,剩下交給樓上…
變成createMutilHtmlObject(array);

謝啦!

感謝神Q超人幫忙,我找到個人認為的最佳寫法:
首先,因為我的頁面有MasterPage,所以,
在Page1.aspx裡就能找到MasterPage的ContentPlaceHolderID

...
<asp:Content ID="ContentPage1" ContentPlaceHolderID="ContentPlaceHolderMasterPage" runat="server">
...
<asp:Label ID="Label1" runat="server"></asp:Label>
<asp:Label ID="Label2" runat="server"></asp:Label>
<asp:Label ID="Label3" runat="server"></asp:Label>
<asp:Label ID="Label4" runat="server"></asp:Label>
...

然後,在Page1.aspx.vb裡:

For i As Integer = 1 To 4
    Dim lb As New Label
    lb = Me.Master.FindControl("ContentPlaceHolderMasterPage").FindControl("Label" & i)
    lb.text = i
Next
0
小魚
iT邦好手 1 級 ‧ 2018-05-15 12:01:49

搞錯了是網頁,

網頁也可以用字串取得控制項,
忽然間找不到,
晚上再找一下...

看更多先前的回應...收起先前的回應...

I'll try, tkx!

小魚 iT邦好手 1 級 ‧ 2018-05-15 12:14:09 檢舉

網頁基本上是用ID找控制項,
可以參考 這一篇

我不是要找控制項耶!
我是要把值代入text

你給我方法我找過,
那是"取出"該控制項的值,是read only的,
但我是要把值"寫入"唷!

小魚 iT邦好手 1 級 ‧ 2018-05-15 21:28:32 檢舉

前端

<form runat="server">
    <asp:Button ID="Button1" runat="server" Text="Button" /><br />
    <asp:Label ID="Label1" runat="server" Text=""></asp:Label><br />
    <asp:Label ID="Label2" runat="server" Text=""></asp:Label><br />
    <asp:Label ID="Label3" runat="server" Text=""></asp:Label><br />
    <asp:Label ID="Label4" runat="server" Text=""></asp:Label>
</form>

後端

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim label As Label
    For i = 1 To 4
        label = FindControl($"Label{i}")
        label.Text = $"測試{i}"
    Next
End Sub

畫面
https://ithelp.ithome.com.tw/upload/images/20180515/20105694Zg7o5IgYPo.jpg

結論:
Read Only在哪裡?

不好意思,因為我有MasterPage,
所以回應錯誤

小魚 iT邦好手 1 級 ‧ 2018-05-16 12:09:00 檢舉

有Master也是Null不是Read Only吧...
有Master就照 神Q超人 說的那樣加個 Master.FindControl() 就可以了.

我要發表回答

立即登入回答