“System.Data.DataView”未标记为可序列化。

“/SZUM.ZHZF.Web.main”应用程序中的服务器错误。
--------------------------------------------------------------------------------

程序集“System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中的类型“System.Data.DataView”未标记为可序列化。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Runtime.Serialization.SerializationException: 程序集“System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中的类型“System.Data.DataView”未标记为可序列化。

源错误:

--------------------------------------------------------------------------------------------------------------------------------------

至今还没有解决的问题.

当 `ComboBox` 绑定 `DataTable` 或 `DataView` 作为数据源时,如果正确设置 `DisplayMember` 和 `ValueMember`,下拉框可能会显示 `System.Data.DataRowView` 而不是预期的文本。这是因为 `ComboBox` 默认调用 `ToString()` 方法,而 `DataRowView` 的默认 `ToString()` 返回的是类型名称。 --- ### **解决方法** #### **1. 设置 `DisplayMember` 和 `ValueMember`** ```csharp // 假设 DataTable 有两列:"ID" 和 "Name" DataTable dt = new DataTable(); dt.Columns.Add("ID", typeof(int)); dt.Columns.Add("Name", typeof(string)); dt.Rows.Add(1, "Apple"); dt.Rows.Add(2, "Banana"); // 绑定数据源 comboBox1.DataSource = dt; // 指定显示的列(DisplayMember)和值的列(ValueMember) comboBox1.DisplayMember = "Name"; // 下拉框显示 "Name" 列的值 comboBox1.ValueMember = "ID"; // 选中项的值是 "ID" 列的值 ``` ✅ **效果**:下拉框显示 `"Apple"`、`"Banana"`,而不是 `System.Data.DataRowView`。 --- #### **2. 检查数据源是否正确绑定** 如果 `DataSource` 绑定错误(如直接赋值 `DataView` 而指定列),可能会导致显示异常: ```csharp // 错误示例:设置 DisplayMember comboBox1.DataSource = dt.DefaultView; // 显示 System.Data.DataRowView ``` ❌ **修复**:仍然需要设置 `DisplayMember` 和 `ValueMember`: ```csharp comboBox1.DataSource = dt.DefaultView; comboBox1.DisplayMember = "Name"; comboBox1.ValueMember = "ID"; ``` --- #### **3. 动态加载数据时的完整示例** ```csharp using System; using System.Data; using System.Data.SqlClient; using System.Windows.Forms; namespace ComboBoxDataBinding { public partial class Form1 : Form { public Form1() { InitializeComponent(); LoadComboBoxData(); } private void LoadComboBoxData() { string connectionString = "Your_Connection_String"; string query = "SELECT ID, Name FROM Fruits"; // 假设有 ID 和 Name 列 using (SqlConnection conn = new SqlConnection(connectionString)) { SqlDataAdapter adapter = new SqlDataAdapter(query, conn); DataTable dt = new DataTable(); adapter.Fill(dt); // 绑定数据源并设置显示列和值列 comboBox1.DataSource = dt; comboBox1.DisplayMember = "Name"; // 显示 Name 列 comboBox1.ValueMember = "ID"; // 值是 ID 列 } } } } ``` --- #### **4. 如果仍然显示 `DataRowView`** - **检查数据源是否为空**:确保 `DataTable` 或 `DataView` 已正确加载数据。 - **检查列名是否正确**:`DisplayMember` 和 `ValueMember` 必须与 `DataTable` 的列名完全一致(包括大小写)。 - **调试数据源**:在绑定前检查 `DataTable` 的内容: ```csharp foreach (DataRow row in dt.Rows) { Console.WriteLine(row["Name"]); // 确认列名和值是否正确 } ``` --- ### **关键点总结** 1. **必须设置 `DisplayMember`**:否则 `ComboBox` 无法知道显示哪一列,默认显示 `DataRowView`。 2. **`ValueMember` 是可选的**:如果不需要获取选中项的值,可以省略。 3. **动态数据源(如数据库)**:确保 `DataTable` 已正确填充数据,且列名匹配。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rjzou2006

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值