我将首先放置示例代码,以便在您阅读我的解释之前获得自己的视图:
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抱歉:)
答案 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;
}