解决 Connecting 清单Boxes

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
在VBA上,我可能比学习C#好一些。

在VBA中,我能够连接3个不同的文本框,以便当您在ListBox1中选择一个项目时,ListBox2和ListBox3都将填充相应的项目(然后将其转移到texbox,以使程序对其执行操作)

我可以使用ListIndex进行此操作,但是在C#中没有发现任何类似的内容。福彩12选5走势图来自3列的表,并且长度相等,并且A列第4项的福彩12选5走势图与B列第4项的福彩12选5走势图相对应。

所以我有通常的SQL连接代码,然后

C#:
While (dr.Read())
{
    listbox1.Items.Add(dr["Item1"]);
    listbox2.Items.Add(dr["Item2"]);
    listbox3.Items.Add(dr["Item3"]);
}

我有允许我按listbox1和listbox2上的文本进行过滤的代码(listbox3实际上是隐藏的,因为我只需要输出)。

我看过MSDN的SelectedIndex文档-如果您有两个相同的项目,则可以使用它,因为它只是在第二个列表框中搜索该项目。但是我有员工ID和员工名称。

我在网上搜索时看到了一些相当复杂的方法,这将要求我重新编写整个代码库,并且鉴于这是我需要的最后一部分...我想避免重新编写整个代码。乐于进行更改,但是如果这些更改受到限制,将会放心。

如果您知道C#的ListIndex指向我,我通常可以阅读并正常工作.....但是我花了最后3个小时来搜索这个问题,但没有发现任何可以完成相同工作的东西。
 
Solution
当您在ListBox1中选择一个项目时,ListBox2和ListBox3都将填充相应的项目
I don't think that that actually describes what you're doing. Do you actually mean that all the ListBoxes are already populated with items 和 then selecting an item in one ListBox automatically selects the corresponding items in the others? If so then you don't need any code at all. Data-binding will handle it for you automatically.

You should first add a BindingSource to your form in the designer. You can then populate a DataTable from your data reader 和 bind that to all your controls via the...

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,501
地点
悉尼,澳大利亚
编程经验
10+
当您在ListBox1中选择一个项目时,ListBox2和ListBox3都将填充相应的项目
I don't think that that actually describes what you're doing. Do you actually mean that all the ListBoxes are already populated with items 和 then selecting an item in one ListBox automatically selects the corresponding items in the others? If so then you don't need any code at all. Data-binding will handle it for you automatically.

You should first add a BindingSource to your form in the designer. You can then populate a DataTable from your data reader 和 bind that to all your controls via the BindingSource. You can even bind the same data to the TextBoxes you mention 和 then they will be automatically populated when you make a selection. Any modifications you make will be automatically pushed back to the DataTable 和 reflected in the bound ListBoxes. E.g.
C#:
var table = new DataTable();

table.Load(myDataReader);

myBindingSource.DataSource = table;

listBox1.DisplayMember = "Item1";
listBox1.DataSource = myBindingSource;
listBox2.DisplayMember = "Item2";
listBox2.DataSource = myBindingSource;
listBox3.DisplayMember = "Item3";
listBox3.DataSource = myBindingSource;

textBox1.DataBindings.Add("Text", myBindingSource, "Item1");
textBox2.DataBindings.Add("Text", myBindingSource, "Item2");
textBox3.DataBindings.Add("Text", myBindingSource, "Item3");
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,501
地点
悉尼,澳大利亚
编程经验
10+
Note that, if you want to filter the data, you should set the Filter property of the BindingSource. That will automatically affect any 和 all controls bound to it.
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
如果ListIndex曾经为您工作,我看不到SelectedIndex如何工作。它们都代表着同一件事:列表的索引。

如果listbox1上的SelectedIndex为2,则只需将listbox2和listbox3上的SelectedIndex设置为2。

在上面的第5段中,您提到要过滤listbox1和listbox2。如果删除列表框中的项目,则应删除其他列表框中相应索引处的项目。

通常,出现问题的主要原因是因为您将UI既用作视图又用作模型。由于RAM和CPU的限制,这在80年代和90年代早已成为标准,迫使人们只能将福彩12选5走势图保存在一个位置并尽量减少移动福彩12选5走势图。到2000年,CPU和RAM有所增加,而且程序员已经了解到,将Model和View混合在一起会导致复杂的代码。如果您将模型分开放置,并且UI的唯一工作就是反映模型的当前状态,那么您只需将模型过滤到应显示的内容,然后UI就会跟进并仅显示那些项目。所有项目将在正确的匹配索引处。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
为帖子#3和#4 +1。他们将福彩12选5走势图加载到DataTable(模型的一种形式)中,并将列表框(视图)绑定到DataTable。
 

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
我从福彩12选5走势图绑定开始,但是当我尝试通过输入到TextBox中的文本来过滤福彩12选5走势图时,我一直抛出错误。这就是为什么我将其留给我尝试上面概述的方法的原因。

我将返回(幸运的是,所有内容仍在VS中),看看是否可以设置Filter属性...

myBindingSource-未分配,我不确定要引用什么...对不起,它可能确实很明显,但是现在凌晨2点,事情还没有达到应有的清晰程度-但如果可以的话,我真的很想完成。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,501
地点
悉尼,澳大利亚
编程经验
10+

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
myBindingSource is your BindingSource that you added as per my instructions.

告诉你,这很明显.....道歉...我可以说,为了我的辩护,它在VS中读为DataSource。...所以我有点不高兴了...稍微难一点,我会看到DataSouce是bindingSource1...。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,501
地点
悉尼,澳大利亚
编程经验
10+
我从福彩12选5走势图绑定开始,但是当我尝试通过输入到TextBox中的文本来过滤福彩12选5走势图时,我一直抛出错误。
We'd have to see the code 和 the error message to know the cause of that but, in general, if you want to filter based on a TextBox then it will be something like this:
C#:
myBindingSource.Filter = $"SomeColumn LIKE '{myTextBox.Text}%'";
That will include only records where the value in the SomeColumn column starts with the text in the TextBox. You can obviously add or remove wildcards 和 use a more complex criteria expression if desired but that's the principle.

One thing to consider is where you set that property. You might do it on the Click of a Button but many will think to do it on the TextChanged of the TextBox. The latter keeps the filter current but the problem is that it will keep changing the filter multiple times as the user types multiple characters, which may degrade the user experience. A solution to that is to start/restart a Timer on TextChanged 和 then set the Filter on Tick. That way, you can set the Interval so that the user never has to wait appreciably for the filter to happen but it's not so quick that it will happen between characters when typing continuously, e.g.
C#:
private void textBox1_TextChanged(object sender, EventArgs e)
{
    // Start/restart the Timer.
    timer1.Stop();
    timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
    bindingSource1.Filter = $"SomeColumn LIKE '{textBox1.Text}%'";
}
You might consider an Interval in the 200 - 500 range.
 

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
我不确定甚至没有该代码,因为在无法使其与福彩12选5走势图绑定一起使用后将其删除。

回到福彩12选5走势图绑定之前,我使用的代码是:

C#:
            var dataList = listBox2.Items.Cast<string>().ToList();

            if (dataList.Count > 0)
            {
                listBox2.Items.Clear();

                listBox2.Items.AddRange(dataList.Where(i => i.Contains(hcodbox.Text)).ToArray());
            }

这似乎工作得很好,但是根本不再起作用。

但是,现在我将您的代码放入“已更改的文本”而不​​是“ SelectedIndex”的更改中……我提到现在已经快凌晨3点了……。并在开头添加了通配符*(这些ID以字母开头,但是我只想按数字进行搜索),效果很好。

我考虑过滴答声,我实际上在应用程序中有一个时钟,所以可以实现它....但是键入时进行更新就可以了。

非常感谢您的帮助,不仅我学到了一些东西……而且我实际上做得更好-并没有那么糟糕的更新-不必重新编写整个内容...奖金。
 
最佳 底部