在C#如何实现从左边的listbox控件的内容移到右边的listbox控件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C#如何实现从左边的listbox控件的内容移到右边的listbox控件相关的知识,希望对你有一定的参考价值。
在左边进行移除操作,然后在右边进行添加操作.先定义一个变量,保存选中的内容。
1、
string aa="";
//首先判断列表框中的项是否大于0
If(ListBox1.Items.Count > 0 )
//移出选择的项
aa=ListBox1.SelectedValue;
ListBox1.Items.Remove(ListBox1.SelectedItem);
2、
ListBox2.Items.Add(aa);
最好在ListBox1的双击事件中实现。否则还要再加一个全局变量,然在ListBox 选择改变事件中保存选中的索引。
不然,当你点击buttom时,可能会出现非你所选的错误 。 参考技术A private void button1_Click(object sender, EventArgs e)
for (int i = 0; i < this.listBox1.SelectedItems.Count; i++)
if(!this.listBox2.Items.Contains(this.listBox1.SelectedItems[i]))
this.listBox2.Items.Add(this.listBox1.SelectedItems[i]);
判断右边的没有则添加 参考技术B 移除左边选中的项,添加到右边
如何在 c# 中使用 user32.dll 从类“ThunderRT6ListBox”的窗口中检索值
【中文标题】如何在 c# 中使用 user32.dll 从类“ThunderRT6ListBox”的窗口中检索值【英文标题】:How can I retrieve the values from window of class "ThunderRT6ListBox" using user32.dll in c# 【发布时间】:2013-09-23 16:34:51 【问题描述】:我正在尝试从 Windows 中的外部桌面应用程序中检索信息。
我知道如何从文本框(类“编辑”)中提取文本,但我不知道如何从类名为“ThunderRT6ListBox”和“ThunderRT6ComboBox”的控件中提取值。我该怎么做?
我有这段代码可以从文本框中提取文本:
public static class ModApi
[DllImport("user32.dll", EntryPoint = "FindWindowA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
[DllImport("user32.dll", EntryPoint = "SendMessageTimeout", SetLastError = true, CharSet = CharSet.Auto)]
public static extern uint SendMessageTimeoutText(IntPtr hWnd, int Msg, int countOfChars, StringBuilder text, uint flags, uint uTImeoutj, uint result);
[DllImport("user32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
static internal extern bool EnumChildWindows(IntPtr hWndParent, funcCallBackChild funcCallBack, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, StringBuilder lParam);
const int LB_GETCOUNT = 0x018B;
const int LB_GETTEXT = 0x0189;
public static string GetText(IntPtr hwnd)
var text = new StringBuilder(1024);
if (SendMessageTimeoutText(hwnd, 0xd, 1024, text, 0x2, 1000, 0) != 0)
return text.ToString();
return "";
public foo()
IntPtr value = new IntPtr(0x019C086A); //ID locate using Spy++
String caption = ModApi.GetText(value);
更新 1:
ListBox的读取方式:
public static List<string> GetListBoxContents(IntPtr listBoxHwnd)
int cnt = (int)SendMessage(listBoxHwnd, LB_GETCOUNT, IntPtr.Zero, null);
List<string> listBoxContent = new List<string>();
for (int i = 0; i < cnt; i++)
StringBuilder sb = new StringBuilder(256);
IntPtr getText = SendMessage(listBoxHwnd, LB_GETTEXT, (IntPtr)i, sb);
listBoxContent.Add(sb.ToString());
return listBoxContent;
更新 2:
从ComboBox读取的方式:
public static List<string> GetComboBoxContents(IntPtr cbBoxHwnd)
int cnt = (int)SendMessage(cbBoxHwnd, CB_GETCOUNT, IntPtr.Zero, null);
List<string> listBoxContent = new List<string>();
for (int i = 0; i < cnt; i++)
//int txtLength = SendMessage(cbBoxHwnd, CB_GETLBTEXTLEN, i, 0);
StringBuilder sb = new StringBuilder(256);
IntPtr getText = SendMessage(cbBoxHwnd, CB_GETLBTEXT, (IntPtr)i, sb);
listBoxContent.Add(sb.ToString());
return listBoxContent;
【问题讨论】:
好吧,看来您已经知道 LB_GETTEXT。你为什么不使用它? 【参考方案1】:您正在处理很久以前的 VB6 应用程序。 “Thunder”是 VB 产品/项目的内部名称(琐碎的旁注)。
你比你意识到的更接近。如果你有控制的 HWND,我认为你有:
-
使用该 HWND 和消息 LB_GETCOUNT 调用 SendMessage 以获取列表中的项目数。
对于每个索引,使用 LB_GETTEXTLEN 和当前项目索引调用 SendMessage 以获取文本的长度,然后相应地分配缓冲区。
再次调用 SendMessage,这次使用 LB_GETTEXT 消息、相同的项目索引(从零开始)和对缓冲区的引用,这应该会为您提供每个项目的文本。
您可能会考虑为 SendMessage 再添加一个声明/别名,它只返回一个 int,这应该会使其中一些调用更简单。
如果我有机会,我稍后会用更具体的代码示例(或至少是伪代码)来清理它,但我觉得你已经走在正确的轨道上,可能只需要这个基本描述以了解其余部分。
祝你好运!
【讨论】:
谢谢。它工作正常,但组合框是另一回事,我无法从组合框中检索元素。我是用CB_GETCOUNT来取回item的个数,但是在阅读文字的时候,不知道是怎么做的。 太棒了。我承认我完全忘记了组合框的 CB_xxxx 常量。我很高兴你让它工作了!!!以上是关于在C#如何实现从左边的listbox控件的内容移到右边的listbox控件的主要内容,如果未能解决你的问题,请参考以下文章