none
[VB2010]變數與二維陣列互相傳值(ByRef)的問題 RRS feed

  • 問題

  • 各位大大好,我有一堆變數,想把他們放在二維陣列中。如下有a,b,c,d四個變數,放在ary的二維陣列中。
    想修改a的值可直接改到ary(0,0)的值;若修改ary(0,0)也可修改a的值。
    不知該如何做,有點像ByRef而不是ByVal。
    也像是把一堆變數集合起來成一個陣列,好集中管理。
    謝謝。

            Dim a As Integer
            Dim b As Long
            Dim c As Short
            Dim d As Boolean
            Dim ary(,) = {{a, b}, {c, d}}
            a = 1
            b = 2
            c = 3
            d = True
    


    2012年3月2日 下午 03:19

解答

  • 我確認一下, 你想把 DataGridView 做成以下這樣 ?

    這不是做不到, 只是有點幾近硬幹, 如果是我寧可自己做一個UserControl 來展現這樣的資料.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 jk.yang 2012年3月5日 下午 03:17
    2012年3月3日 下午 05:15
    版主
  • Windows Form 提供了很多工具, 並不是只有 DataGridView 而已...

    根據我的判斷, 其實你要的功能無非是 CRUD 罷了。對於欄位多的資料, 硬要塞入 DataGridView 是沒有道理的。我提供我正在寫的一個程式的截圖, 或許可以讓你參考:

    程式的下方是 DataGridView, 但在這裡我只拿它來列出部份資料; 上方的部份是手動建立的, 可供做顯示、新增和修改。優點是彈性大, 缺點是幾乎全部的動作都要靠自己寫程式。

    當然, 對某些人而言, 這樣做法等於是做苦工; 但是我習慣了。如果你想偷點懶, 那麼你或許可以參考看看 NHibernate 或 LightSwitch 等工具。自己在網路上查查看吧。


    • 已標示為解答 jk.yang 2012年3月5日 下午 03:17
    2012年3月3日 下午 05:50

所有回覆

  • 給你一個建議: 如果你打算大量使用指標(Pointer)功能的話, 使用 C/C++ (而不是VB) 來寫程式會是比較適當的選擇。

    如果你確實只有四個變數要與一個陣列做對應, 那麼寫一個 Class, 在裡面加上四個 Property 分別做 Get 和 Set 以對應那個陣列。這也是一個方法。

    此外, 你的陣列內容的型別各不相同; 你可能誤解了陣列的本質。或許在你的情境中, 根本無需使用到陣列。使用自訂型別可能更適合。


    2012年3月2日 下午 04:17
  • 請參考線上手冊

    實值型別

    參考型別

    兩種變數類型的說明。看完你就知道答案了。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年3月2日 下午 04:48
  • 或許你可以考慮用其他集合物件,像是ArrayList,只是不知道這樣是否符合你的需求。

    http://msdn.microsoft.com/zh-tw/library/system.collections.arraylist(v=vs.80).aspx

    以下為簡單的範例程式碼,有興趣可以參考看看。

    Dim a As Integer
    Dim b As Long
    Dim c As Short
    Dim d As Boolean
    Dim al As New ArrayList()
    
    a = 1 : b = 2 : c = 3 : d = True
    al.Add(a) : al.Add(b) : al.Add(c) : al.Add(d)
    
    For Each o As Object In al
    	Console.WriteLine(String.Format("{0},{1}", o.GetType().ToString(), o))
    Next


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年3月3日 上午 12:45
  • 您好,如同前面幾位大大說的,您先想一下,您這麼做的目的哦!
    如果只是要變數的話,就不用將它放入array之中。
    用了array後,不需要再分別針對每個元素來用一個變數來存它!
    您真正這麼做的目的是什麼呢?

    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年3月3日 上午 02:36
  • .NET Framework 入門筆記 -- 實值型別Value Type

    你提供範例中,全部都是Call by Value。

    如果只是想透過陣列來管理變數(假設可行),你真的認為那會比較方便嗎?

    例如,ary(36,55) 這種組合,有幾個人能在不使用的一個月後想起來,這個 ary(36,55) 是那個變數,做什麼用的?

    變數不好管理,通常「命名」有很大一部分關係,就像你所打的 a, b, c, d 就很不好,好的命名才能帶來方便的管理與使用。


    blog.kkbruce.net
    Plurk
    Google+專頁

    春有百花秋有月,
    夏有涼風冬有雪,
    若無閒事在心頭,
    便是人間好時節。

    2012年3月3日 上午 06:57
  • 同 Johnny 講的, 樓主想要的, 恐怕要指標才辦得到, 很不幸 Visual Basic 沒有指標, C# 的指標感覺是半殘.

    不過我是真的想知道, 樓主要這麼做的用意是什麼 ? 也許把你想做的事情說明清楚, 大家可以討論出一個更適合的解決方案.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年3月3日 上午 08:46
    版主
  • 感謝各位網友的熱情回覆,回覆的內容尚未完全消化。
    先回答亂兄與Bill兄:我真正的目的是什麼?
    其實我要的是在一個DataGridView中,通常每個column代表一個屬性,如下圖

    但這樣會讓整個頁面變得很長。

    我希望能改成如下圖,雖然某些cell不是值(value)而是標題(title),
    我需要建一個對應表(look up table)將對應的值載入,
    並用這個對應表將DataGridView中改完的結果回傳給每個變數。

    這個對應表與變數們之間傳值的問題就是我想問的。
    感恩~

    2012年3月3日 下午 04:28
  • 我確認一下, 你想把 DataGridView 做成以下這樣 ?

    這不是做不到, 只是有點幾近硬幹, 如果是我寧可自己做一個UserControl 來展現這樣的資料.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 jk.yang 2012年3月5日 下午 03:17
    2012年3月3日 下午 05:15
    版主
  • Windows Form 提供了很多工具, 並不是只有 DataGridView 而已...

    根據我的判斷, 其實你要的功能無非是 CRUD 罷了。對於欄位多的資料, 硬要塞入 DataGridView 是沒有道理的。我提供我正在寫的一個程式的截圖, 或許可以讓你參考:

    程式的下方是 DataGridView, 但在這裡我只拿它來列出部份資料; 上方的部份是手動建立的, 可供做顯示、新增和修改。優點是彈性大, 缺點是幾乎全部的動作都要靠自己寫程式。

    當然, 對某些人而言, 這樣做法等於是做苦工; 但是我習慣了。如果你想偷點懶, 那麼你或許可以參考看看 NHibernate 或 LightSwitch 等工具。自己在網路上查查看吧。


    • 已標示為解答 jk.yang 2012年3月5日 下午 03:17
    2012年3月3日 下午 05:50