2010-10-21 167 views
1

嘿! 現在首先有些人可能會想喊這個話題有數百個話題 - 這是真的 - 但不適合我的特殊情況......所以請幫助我:)自動滾動列表框

我會先將示例代碼放在第一位所以你得到你自己的它的視圖,你看我的解釋之前:

class cls1 
{ 
    cls2.listadd("bla"); 
} 

class cls2 
{ 
    public static Bindinglist<string> list = new Bindinglist<string>(); 

    public static void listadd(string x) 
    { 
     list.Add(x); 
    } 
} 


class Form1 
{ 
    //here would be all the listbox settings 
    private System.Windows.Forms.ListBox lb; 

    lb.Datasource = cls2.list 
} 

class maincls 
{ 
    static void main() 
    { 
     Application.Run(new Form1); 
    } 
} 

因此,情況如下:我有一個類只有一個靜態列表&靜態程序添加到這個列表(這是一個控制檯許多其他類的輸出類型,所以它必須可以從多個類訪問,而無需一直重新進行)。 當然,因爲不同的程序類可以「登錄」到這個列表中,所以它總是需要更新,這就是爲什麼我選擇了BindingList,因此listbox和bindinglist之間的數據綁定總是自動更新列表框。 -Which導致我的問題:正如你從其他許多關於滾動條的帖子所知道的那樣,當你向列表框中添加一個新項目時,它始終保持在頂部。 現在我知道有使用兩個精彩的方法或者 的.SelectedIndex方法:

listBox.SelectedIndex = listBox.Items.Count - 1; 
listBox.SelectedIndex = -1; 

或.TopIndex方法:

listbox.TopIndex = listbox.Items.Count -1; 

和他們的工作奇妙 - 但這裏是我問題
- 我不能將這些方法放置在每次添加後的cls2中,因爲它無法訪問Form1中的非靜態列表框。
- 如果我將方法放在Form1中,它們將工作,但不能從cls2調用,因爲不是靜態的。
- 如果我將Form1中的方法設置爲靜態方法,則它們再次出現該訪問問題。
- 我不能使列表框完全靜態,因爲所有的表單不會工作。
- 當數據發生變化而沒有人爲交互時,似乎沒有列出的事件。
- 我不能使用綁定列表的添加事件,因爲我再次遇到訪問問題。

另一個想法是創建一個主窗體調用所有其他的人,包括那些包含程序無效的方法,但再沒有...情況下,不上網,不訪問時,靜態...

我想我被困在一個位圈在這裏:P

我只是希望你們想出解決這個問題的一些好主意....

非常感謝提前爲您的幫助!

解決方案:第4個答案....是愚蠢的系統:P對不起:)

回答

0

在cls2類(行ItemAdded)中創建靜態事件。從listadd函數中引發它。在Form1構造函數中訂閱此事件,並在事件處理程序中向下滾動列表框。

+0

嗨!感謝您的快速回答......這聽起來很棒......我很樂意爲它使用一個活動......馬上試試吧......只是好奇你究竟是什麼意思「訂閱此活動在Form1中「?我不太確定那裏......現在就試試吧...... :) – Lorenz 2010-10-21 14:01:54

+0

假設cls2具有靜態ItemAdded事件,請在Form1中寫入:cls2.ItemAdded + =按下Tab並且Visual Studio編輯器完成此操作,編寫訂閱代碼和事件處理程序。 – 2010-10-21 14:16:00

+0

明白了:)現在我讀了你的第一篇文章,看起來很清楚:P所以非常感謝!這裏是我的解決方案適用於該示例:添加到cls2: - 編輯必須將其保存到自己的答案...格式不起作用.... – Lorenz 2010-10-21 14:34:57

0

爲什麼不直接調用靜態函數在形式或暴露SelectedIndex屬性。

public static void DoSomeListBoxStuff(int index) 
{ 
    // do something 
} 

或者

int SelectedIndex 
{ 
    get 
    { 
     return ListBox1.SelectedIndex; 
    } 
    set 
    { 
     ListBox1.SelectedIndex = value; 
    } 
} 
+0

thanx您快速的答案...我還沒有嘗試過,因爲亞歷克斯·法伯提出了一個非常好的基於事件的解決方案......但是,無論如何謝謝! – Lorenz 2010-10-21 14:41:05

0

嘗試創建CLS2靜態字段,將持有Form1類的實例。然後通過這個對象可以訪問非靜態列表框對象,或者甚至可以更好地調用form1類中的非靜態函數並讓它滾動列表框。

+0

感謝您的快速回答! – Lorenz 2010-10-21 13:57:47

+0

哎呀,現在多數民衆贊成是什麼時候你打回來^^以及我看到的問題是,如果我在CLS2中的靜態函數中創建一個Form1的實例,然後再次這個實例是不是全球CLS2可用,所以我不能調用Form1中的非靜態刷新方法,並且我無法在沒有構造函數和靜態成員的類中的函數外創建實例....或者我得到這個錯誤嗎? – Lorenz 2010-10-21 14:00:28

+0

不要在函數中創建form1的實例,而是在類級別將其創建爲字段。你可以從一個構造者初始化這個字段。 – Machta 2010-10-21 18:20:37

0

對不起,如果我在這裏得到的系統錯誤...但我無法編輯我的第一篇文章,當我想發表評論中的最終解決方案,它沒有正確格式的答案...
所以這裏的解決方案適合我的例子......非常感謝所有人 - 特別是Alex Farber!

添加到CLS2:

public static event EventHandler<EventArgs> added; 
    //Here would be the line that adds a line to the Bindinglist 
    added(new object(), EventArgs.Empty); 

添加到Form1的構造函數:

cls2.added +=new EventHandler<EventArgs>(rescroll); 

添加到Form1,代碼部分:

public void rescroll(object sender, EventArgs e) 
     { 
      lb.SelectedIndex = lbcons.Items.Count - 1; 
      lb.SelectedIndex = -1; 
     }