Advertisement

C#中CheckedListBox控件用法总结

  •  5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:None


简介:
本文档深入探讨了在C#编程语言中如何使用CheckedListbox控件,包括其基本操作、事件处理和自定义样式等方面的知识。 通常认为使用`foreach (object obj in checkedListBox1.SelectedItems)`可以遍历选中的值。但实际上这种方法只能遍历高亮显示的项,并不能获取到勾选框中被标记为已选择的项目。为了正确地遍历所有已被打钩的选择项,应该采用以下代码: ```csharp for (int i = 0; i < checkedListBox1.Items.Count; i++) { if (checkedListBox1.GetItemChecked(i)) { MessageBox.Show(checkedListBox1.GetItemText(checkedListBox1.Items[i])); } } ``` 最近在使用`checkl`时,我发现了这一点。

全部评论 (0)

还没有任何评论哟~
客服
客服
  • C#CheckedListBox
    优质
    本文档深入探讨了在C#编程语言中如何使用CheckedListbox控件,包括其基本操作、事件处理和自定义样式等方面的知识。 通常认为使用`foreach (object obj in checkedListBox1.SelectedItems)`可以遍历选中的值。但实际上这种方法只能遍历高亮显示的项,并不能获取到勾选框中被标记为已选择的项目。为了正确地遍历所有已被打钩的选择项,应该采用以下代码: ```csharp for (int i = 0; i < checkedListBox1.Items.Count; i++) { if (checkedListBox1.GetItemChecked(i)) { MessageBox.Show(checkedListBox1.GetItemText(checkedListBox1.Items[i])); } } ``` 最近在使用`checkl`时,我发现了这一点。
  • VC++List Control
    优质
    本文档全面总结了在VC++环境下使用List Control控件的方法与技巧,涵盖了其基本操作、事件处理及自定义功能等内容。适合初学者和进阶用户参考学习。 1. 在MFC中新建对话框,在对话框上放置一个ListCtrl控件,并将其ID设置为IDC_PATHView:Report。 2. 为该ListCtrl添加变量,右击后选择“添加变量”,并命名为m_wndPath。 3. 找到OnInitDialog()函数并在其中加入以下代码: ```cpp // 清空列表项 m_wndPath.DeleteAllItems(); // 添加列标题 m_wndPath.InsertColumn(0, _T(项目)); m_wndPath.InsertColumn(1, _T(所在路径)); // 设置第一列的宽度为150像素 m_wndPath.SetColumnWidth(0, 150); ```
  • C#AutoMapper的使
    优质
    本文档总结了在C#编程语言中如何利用AutoMapper进行对象间的数据映射,包括其基本配置、高级用法及常见问题解决技巧。 本段落详细介绍了C# AutoMapper的使用方法,并通过代码示例帮助读者更好地理解和学习相关内容。对这一主题感兴趣的朋友可以参考此文进行了解。
  • C语言static的
    优质
    本文档全面总结了C语言中关键字static的各种使用方法和作用,包括文件范围内的静态变量、函数以及局部静态变量等,帮助程序员深入理解并灵活应用static特性。 C程序的存储空间布局主要包括以下几个部分: 1. 正文段:包含CPU执行的机器指令;每个程序只有一个副本,并且是只读的,以防止由于意外事故导致自身代码被修改。 2. 初始化数据段(也称为数据段):存放所有在程序中赋了初始值的全局变量。 3. 非初始化数据段(bss段):包含未进行初始化的所有全局变量;内核会将这些变量设置为0。 4. 栈:自动增长,主要用于存储函数调用时所需的临时信息和局部变量。栈的增长方向是从高地址向低地址增加的。 5. 堆:用于动态分配内存的空间。
  • CC++union的使
    优质
    本文档全面总结了在C和C++编程语言中如何有效地利用联合体(union)数据类型,包括其定义、内存布局及应用场景。适合希望深入了解联合体特性的开发者参考学习。 在C语言与C++编程环境中,`union`是一种特殊的数据类型,在相同的内存位置存储不同类型的数据变量。理解其核心在于掌握如何利用内存空间以及不同数据类型的切换机制。 **什么是共用体(Union)?** 在C/C++中,`union`也被称为联合体或共用体。它允许在同一块内存区域里保存多种不同的数据类型。与结构体中的每个成员拥有独立的存储位置不同,一个`union`的所有成员共享相同的地址空间。这意味着对其中一个成员进行修改会影响其他所有成员的数据。 **Union的内存分配** 考虑以下定义: ```c struct student { char mark; long num; float score; }; union test { char mark; long num; float score; }; ``` 对于`struct student`,由于每个字段占据独立的空间,其总体大小为所有成员字节之和(通常是3个字符的`char` + 4个字节的`long` + 4个字节的浮点数 = 12字节)。 然而,在定义了包含相同元素类型的共用体后,由于这些字段共享同一地址范围,该共用体的实际大小将由其中最大的成员决定。因此,上述例子中的`union test`仅占用最大类型(通常是整型或单精度浮点数的4个字节)的空间。 **C语言中使用Union** 在C语言环境中应用`union`时需注意以下几点: 1. **定义变量**: 首先声明一个共用体类型,然后创建该类型的实例。 2. **访问成员**: 不能直接引用整个共用体对象;必须通过其具体成员来操作。例如: ```c union test a; a.mark = b; // 将字符b赋值给mark字段 printf(%d, a.mark); // 输出字符b的ASCII码对应的整数值 ``` 3. **覆盖现象**: 任何时候,共用体中仅有一个成员处于活动状态。为一个成员赋予新值时会清除其他所有先前存储的数据。 4. **瞬态特性**: 当对某个字段进行赋值操作后,其它未被访问过的字段将不再保留其原有数据。 **Union与对象** 当`union`包含复杂类型如结构体或类的对象时,情况更加复杂。这类成员的大小和内存布局会影响整个共用体的空间需求及行为模式。例如: ```c struct point { int x; int y; }; union complex_type { struct point p; // 结构体内嵌入到共用体中 }; ``` 这里,`complex_type`的实际尺寸至少等于结构体的大小(即8字节),即使其他较小类型成员的存在。此外,在涉及对象操作时需要注意内存对齐规则的影响。 总之,虽然在某些特定场景下使用共用体会显得非常高效和灵活,但是由于其独特的数据覆盖机制以及潜在的数据安全风险,开发者应当谨慎对待,并确保充分理解相关概念后才加以应用。
  • C#使COM组
    优质
    本文档对在C#编程环境中如何有效地使用和集成COM(Component Object Model)组件的方法进行了全面总结,旨在帮助开发者解决兼容性和互操作性问题。 本段落总结了C#调用COM组件的方法,并详细介绍了将COM类型信息转换为.NET元数据、查看元数据以及编写测试程序等多个步骤。 一、 将COM类型信息转化为.NET元数据:在使用C#调用COM组件时,第一步是需要将COM类型的描述文件(通常为Tlb格式)通过一个名为Tlbimp.exe的工具转译成适用于.NET环境的数据结构。这种转换使得原本只能被非托管代码使用的COM对象能够与.NET程序进行交互。 二、 查看元数据:完成上述步骤后,下一步便是利用ILDasm这样的工具来查看由Tlbimp生成的.NET元数据文件的具体内容和细节了。这一步骤有助于开发者更好地理解这些新创建的数据结构,并确保它们符合预期的功能需求。 三、 编写测试程序:为了验证COM组件是否能够成功地在C#项目中运行,下一步是构建一个简单的控制台应用程序来调用并测试该组件的方法功能。具体来说,在解决方案资源管理器里添加对所需COM库的引用后,就可以通过编写相应的代码段来进行实际的功能性检验了。 四、 COM组件的应用价值:除了上述技术细节之外,本段落还讨论了在托管环境中使用COM对象的意义和优势,如它们可以作为独立服务或中间件来实现特定业务逻辑等。这使得开发者能够更好地利用现有的非.NET资源并将其整合进现代化的软件开发流程中去。 五、 元数据生成:文中提到通过将原始的COM类型库转换为元数据格式后,这些新的描述信息就可以被用于进一步构建托管代码环境中的应用程序了。 六、 自定义包装器(Custom Wrappers): 本段落还简单介绍了利用自定义包装技术来实现更灵活和高效的COM组件集成方式。这种方式可以提供额外的功能定制能力,并且简化跨平台的开发过程。 总之,这篇文章详细讲解了C#调用COM组件的方法及其应用价值,为开发者提供了宝贵的参考信息。
  • C#子线程更新UI的实例
    优质
    本篇文章总结了在C#编程语言中使用子线程更新UI控件的方法和技巧,并通过具体实例进行说明。 在C#编程中,尤其是在开发桌面应用程序(如WinForms或WPF)时,经常会遇到需要从子线程更新UI控件的需求。由于UI界面通常运行于主线程上,为了保证用户界面的响应性和避免线程冲突问题,在非UI线程中安全地修改UI元素是必需的。本段落将详细介绍两种在C#应用中的常用方法来实现这一目标。 **1. 使用Invoke和BeginInvoke** 控件类(如Label、Button等)都实现了`ISynchronizeInvoke`接口,这个接口提供了跨线程访问的能力。其中的`Invoke`方法允许我们在非UI线程上执行一个委托,并确保该操作在创建控件的主线程中运行,这使得我们可以安全地修改UI元素。 下面是一个使用Invoke方法的例子: ```csharp private void button6_Click(object sender, EventArgs e) { Thread demoThread = new Thread(new ThreadStart(threadMethod)); demoThread.IsBackground = true; demoThread.Start(); } void threadMethod() { Action AsyncUIDelegate = delegate(string n) { label1.Text = n; }; label1.Invoke(AsyncUIDelegate, new object[] {修改后的label1文本}); } ``` `BeginInvoke`方法与`Invoke`类似,但它不会阻塞当前线程而是立即返回,并在适当的时候执行委托。 **2. 使用SynchronizationContext的Post和Send** `SynchronizationContext`类提供了一种跨线程通信的方法。通过获取UI线程上的同步上下文实例并使用其提供的方法可以在其他线程中调度任务,从而更新UI元素。 ```csharp SynchronizationContext _syncContext = null; private void button6_Click(object sender, EventArgs e) { Thread demoThread = new Thread(new ThreadStart(threadMethod)); demoThread.IsBackground = true; demoThread.Start(); } public Form1() { InitializeComponent(); _syncContext = SynchronizationContext.Current; } private void threadMethod() { _syncContext.Post(SetLabelText,修改后的文本); } private void SetLabelText(object text) { this.label1.Text = text.ToString(); } ``` 在这个例子中,`Post`方法异步执行了`SetLabelText`方法,在UI线程上更新控件。 这两种方式都是为了确保任何对UI元素的更改操作都在主线程上进行。选择哪种取决于你是否需要等待更新完成(Invoke适用于同步更新而Post适合于异步更新)。在实际应用中,通常建议使用`Invoke`或`BeginInvoke`方法来直接与特定控件交互,而当涉及到更复杂的跨线程通信时则可以考虑利用SynchronizationContext。无论采用哪种方式,都应确保理解基本的线程同步原理以保证代码的质量和正确性。
  • C语言##符号的
    优质
    本文总结了C语言中#和##预处理符的使用方法及其在宏定义中的作用,帮助读者更好地理解和运用这些特殊符号。 在C语言编程中,预处理器宏是一种强大的工具,在编译阶段进行文本替换操作。`#` 和 `##` 是这两种特殊符号中的两个重要组成部分。 首先来看 `#` 操作符的用法:它将宏参数转换为字符串字面量。例如: ```c #define STR(s) #s ``` 当使用 `STR(vck)` 时,该宏会被展开成 `vck` 字符串形式。 接下来是 `##` 的功能介绍:用于连接两个宏参数,形成一个新的单一标识符。举个例子来说: ```c #define CONS(a, b) int(a##e##b) ``` 这里的 `a` 和 `b` 会被拼接在一起生成新的标识符。调用如 `CONS(2, 3)` 将会创建一个整型常量,即 `(int)(2e3)` 或者是数值 `2000`. 但是需要注意的是,在宏参数本身为另一个宏定义的情况下,使用 `#` 和 `##` 操作符时会导致该参数不再进一步展开。例如: ```c #define TOW 2 #define MUL(a, b) (a * b) ``` 在此情况下调用 `MUL(TOW, TOW)` 将不会将 `TOW` 展开为数字 `2`, 而是直接使用宏名作为参数,导致输出结果为 `(2) * (2)`。 为了防止这种情况发生,可以引入一个中间转换的宏来确保所有参数在与 `#` 或者 `##` 结合之前先被展开。例如: ```c #define _STR(s) #s #define STR(s) _STR(s) #define _CONS(a, b) int(a##e##b) #define CONS(a, b) _CONS(a, b) ``` 这样,使用宏定义如 `STR(INT_MAX)` 和 `CONS(A, A)` 将会正确地展开为期望的形式。 此外,`#`和`##`还有一些其他的应用场景。例如: ```c #define ___ANONYMOUS1(type, var, line) type var##line #define __ANONYMOUS0(type, line) ___ANONYMOUS1(type, _anonymous, line) #define ANONYMOUS(type) __ANONYMOUS0(type, __LINE__) ``` 上述代码片段用于生成匿名变量名,其中`__LINE__`宏代表当前的行号。例如: ```c static int ANONYMOUS(static int); ``` 将会定义一个名为 `int_anonymous70;` 的静态整型变量(假设该语句出现在第 70 行)。 另一个例子是使用 `##` 操作符填充结构体成员,如下所示: ```c #define FILL(a) {a, ``` 这个宏可以用于初始化匿名数组的元素。例如: ```c FILL(10) FILL(20)} ``` 将生成 `{10, 20, }` 的结构体初始化语法。 总而言之,`#` 和 `##` 是C语言中预处理操作符的重要组成部分,允许在宏定义内执行字符串化和标识符拼接等复杂文本转换任务。正确使用这些操作符对于编写高效灵活的代码是至关重要的。
  • C++#include头文
    优质
    本文对C++编程语言中常用的#include头文件进行了全面总结和分类介绍,帮助读者快速掌握标准库中的重要组件及其用途。 本段落详细列举了C++所包含的头文件及其作用说明,非常适合初学者参考学习。几乎每一个C++程序都会用到`#include`指令来引入必要的库函数或类定义,但很多人可能并没有特别关注后面跟的是什么内容。通过对照本段落中的介绍,相信会对大家理解C++结构有所帮助。 - `#include `:用于STL双端队列容器。 - `#include `:提供异常处理所需的类。 - `#include `:支持文件的输入和输出操作。 - `#include `:定义各种运算函数,可以替代传统的运算符使用,主要用于STL中。 - `#include `:包含各类数据类型的最大值与最小值常量。
  • C++字符串常函数
    优质
    本文档对C++编程语言中的字符串处理常用函数进行了全面总结和说明,旨在帮助开发者更高效地使用这些工具进行文本操作。适合所有级别的程序员参考学习。 在C++编程中,`std::string` 是一个非常重要的数据类型,它提供了许多方便的函数来处理字符串。这里我们将深入探讨一些常用的 `std::string` 函数及其用法。 要使用 `std::string`,我们需要包含 `` 头文件,并可选择使用 `std::` 命名空间: ```cpp #include using namespace std; ``` 1. **声明字符串** 声明一个 `std::string` 变量非常简单,如 `string str;`。默认情况下,这会创建一个空字符串。`std::string` 类提供了多种构造函数,用于不同方式的初始化,包括拷贝构造、指定初始子串和 C 风格字符串等。 2. **字符串操作函数** - **赋值**:可以使用 `=`, `assign()` 函数来给字符串赋值。 - **交换**:`swap()` 函数用于交换两个字符串的内容。 - **追加**:`+=`, `append()`, `push_back()` 用于在字符串末尾添加字符。 - **插入**:`insert()` 可以在任意位置插入字符或字符串。 - **删除**:`erase()` 用于删除字符串中的字符或子串。 - **清除**:`clear()` 删除字符串中的所有字符。 - **替换**:`replace()` 用于替换字符串中的一部分。 - **串联**:`+` 运算符可以用来连接两个字符串。 - **比较**:`==`, `!=`, `<`, `<=`, `>`, `>=`, `compare()` 用于比较字符串。 - **大小**:`size()`, `length()` 返回字符串的字符数。 - **最大大小**:`max_size()` 返回字符串的最大可能长度。 - **空状态检查**:`empty()` 判断字符串是否为空。 - **容量管理**:`capacity()` 返回当前已分配的容量,`reserve()` 预分配内存以适应特定长度的字符串。 - **存取单个字符**:使用 `[]` 或 `at()` 访问字符串中的单个字符。 - **输入输出**:`>>` 从流中读取字符串,`<<` 将字符串写入流。 - **复制到 C 风格字符串**:`copy()` 将字符串复制到 C 风格的字符串, `c_str()` 返回以 `\0` 结束的 C 风格字符数组。 - **子字符串**:`substr()` 返回一个子串。 - **查找**:`find()` 函数用于查找子串的位置。如果找不到,则返回 `npos`。 - **迭代器**:`begin()`, `end()` 提供前向迭代器,`rbegin()`, `rend()` 提供逆向迭代器。 举例来说,假设我们有一个字符串 `str` ,我们可以这样操作它: ```cpp str = Hello; // 赋值 str.append( World); // 追加 str.insert(6, , Nice ); // 在第6个位置插入字符或子串。 str.replace(11, 5, to meet you!); // 替换从第11个字符开始的5个字符。 ``` 3. **大小调整与效率** 当需要确保字符串有足够的空间存储特定数量的字符时,`reserve()` 函数很有用。它可以避免频繁地重新分配内存,并提高性能。 ```cpp str.reserve(20); // 预留20个字符的空间 ``` 4. **比较与排序** 使用 `compare()` 可以进行更复杂的字符串比较。它不仅会比较字面值,还可以在指定范围内比对子串: ```cpp int result = str.compare(World); // 如果str等于World, 则result为0。 ``` 5. **查找函数** `find()` 函数用于查找子串的位置,如果找不到则返回 `npos`。 ```cpp size_t pos = str.find(Nice); // 查找 Nice 的位置。 ``` 6. **迭代器** 使用迭代器可以遍历字符串中的每个字符。这在使用 STL 算法时非常有用: ```cpp for(auto it = str.begin(); it != str.end(); ++it) { cout << *it; } ``` `std::string` 类提供了丰富的功能,使得在 C++ 中处理字符串变得方便且高效。根据需求选择合适的函数可以大大提高代码的可读性和可维护性。