自动滚动列表框

时间:2010-10-21 13:18:09

标签: c#

嘿那里! 现在首先有些人可能想大声说有关于此的数百个主题 - 这是真的 - 但不是因为我的特殊情况......所以请帮帮我:)。

我将首先放置示例代码,以便在您阅读我的解释之前获得自己的视图:

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);
    }
}

所以情况如下:我有一个只有静态列表的班级&amp;添加到此列表的静态过程(它是许多其他类的控制台类型的输出,因此必须可以从几个类访问它而不必一直重新创建)。 当然,由于不同的程序类可以“登录”到这个列表中,因此总是必须更新,这就是我选择BindingList的原因,因此listbox和bindinglist之间的数据绑定总是自动更新列表框。 - 这导致了我的问题:正如您从许多其他有关滚动条的帖子中所知,当您将新项目添加到列表框时,它始终保持在顶部。 现在我知道有两个很棒的方法 .SelectedIndex方法:

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

或.TopIndex方法:

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

他们的工作很精彩 - 但这是我的问题
- 我不能在每次添加后将这些方法放在cls2中,因为它无法访问Form1中的非静态列表框。
- 如果我将方法放在Form1中,它们可以工作,但不能从cls2调用,因为不是静态的 - 如果我将Form1中的方法设置为静态,则会再次出现访问问题 - 我无法使列表框完全静态,因为所有表单内容都不会起作用 - 当数据在没有人为交互的情况下发生变化时,列表框似乎没有事件发生 - 我不能使用BindingList的add-event,因为那时我再次遇到访问问题。

另一个想法是创建一个主窗体,调用所有其他窗体,包括一个包含这些过程的void方法,但是再次......没有实例的访问,静态时无法访问...

我想我在这里陷入了一些困境:P

我希望你们能提出一些解决这个问题的好主意....

非常感谢您的帮助!!!

解决方案:第4个答案....对系统来说是愚蠢的:P抱歉:)

4 个答案:

答案 0 :(得分:0)

为什么不在Form中调用静态函数或公开SelectedIndex属性。

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

或者

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

答案 1 :(得分:0)

尝试在cls2中创建一个静态字段,用于保存form1类的实例。然后通过这个对象,您可以访问非静态列表框对象,甚至可以更好地调用form1类中的非静态函数,并让它滚动ListBox。

答案 2 :(得分:0)

在cls2类中创建静态事件(行ItemAdded)。从listadd函数中提升它。在Form1构造函数中订阅此事件,并在事件处理程序中向下滚动列表框。

答案 3 :(得分: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;
        }