【问题标题】:The combobox displays system.data.datarowview组合框显示 system.data.datarowview
【发布时间】:2015-11-22 05:39:53
【问题描述】:

我在 winform 中有一个组合框,它通过调用 MySQL 中的存储过程来获取数据。

我的存储过程:

CREATE PROCEDURE `GetCourses`()
BEGIN
SELECT course_name FROM my_db.courses where group_id=1;
END

现在课程名称与 Combobox(ComboBox2) 绑定如下 - 在选择另一个 Combobox(ComboBox1) 时:

private void Form_Load(object sender, EventArgs e)
{
  var connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
  conn = new MySqlConnection(connectionString);
  conn.Open();
  MySqlCommand cmd1 = new MySqlCommand();
  cmd1.Connection = conn;
  cmd1.CommandType = CommandType.StoredProcedure;
  cmd1.CommandText = "GetCourses";
  DataTable dt1 = new DataTable();
  MySqlDataAdapter adp1 = new MySqlDataAdapter(cmd1);
  adp1.Fill(dt1);
}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
  if (comboBox1.SelectedIndex == 3)
  {
    comboBox2.ValueMember = "course_name";
    comboBox2.DisplayMember = "course_name";
    comboBox2.DataSource = dt1;
  }
}

但是当我运行表单时,ComboBox 会填充为“system.data.datarowview”的值

谁能帮帮我。

注意:我不想通过使用“MySqlDataReader”来实现这一点

提前致谢。

【问题讨论】:

  • 表适配器不是更好的工具吗?我认为您在数据适配器中使用了错误的工具,因为它创建了一个完整的数据集。那或者你可能需要指定它应该从中获取数据和列名的确切表。

标签: c# mysql winforms combobox


【解决方案1】:

以下两行代码即可解决。

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
  if (comboBox1.SelectedIndex == 3)
  {
    foreach (DataRow row in dt1.Rows)
      comboBox2.Items.Add(row["course_name"]);
  }
}    

【讨论】:

  • 你真的不应该这样做。您必须在某处有代码可以清除值和显示成员。但是,如果您使用它,您可能需要先清除项目,否则每次选择索引 3 时都会再次添加行。
  • 没错!我在我的代码中添加了 comboBox2.Items.Clear() .. 谢谢@Crowcoder !!
【解决方案2】:

您可以将数据投影到具有命名字段的集合中,以防止数据行对象的默认 ToString()ing:

 if (comboBox1.SelectedIndex == 3)
  {
    comboBox2.ValueMember = "course_name_value";
    comboBox2.DisplayMember = "course_name";
    comboBox2.DataSource = dt1.AsEnumerable().Select 
       (n => new { course_name = n["course_name"], course_name_value = n["course_name"]}).ToList();
  }

编辑

我认为您应该将这些行放在 Load 事件中。您不需要多次设置它们,这可能是组合框显示获取对象的 ToString() 结果而不是单个属性的原因。

comboBox2.ValueMember = "course_name";
comboBox2.DisplayMember = "course_name";

【讨论】:

  • 我不太明白。当我尝试这个时,“course_name”和“course_name_value”上的一些错误在当前上下文中不存在。我不知道这一点。能否请您详细说明..
  • 抱歉,我编辑了代码以便它可以工作。我应该知道最好不要直接输入答案而不进行测试。
  • 现在没有错误了!。但这在组合框中显示为“{ course_name = MBA, course_name_value = MBA}”..
  • 我在实际项目中尝试时没有遇到这个问题。会考虑的......
  • 检查我的编辑。将值移动(而不是复制)并显示成员分配到 Load 事件。
【解决方案3】:

我运行了一个模拟测试,我认为它会在您处理 selectedIndex 更改事件之前处理您的数据集(当它完成 OnLoad 事件时)。尝试让您的 SelectedIndexChanged 事件引发一个函数来填充第二个框。 PS,别介意我用 SQLite 数据库来测试。

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
        If (ComboBox1.SelectedIndex = 3) Then            
            Select3()    
        End If
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load    
        Dim range() As String = {"0", "1", "2", "3 - Fire Combo2", "4", "5", "6"}
        ComboBox1.Items.AddRange(range)            
    End Sub

    Private Sub Select3()
        Dim connectionString As String = MyStandAloneDB.DBConnStr
        Dim conn As New System.Data.SQLite.SQLiteConnection(connectionString)
        conn.Open()
        Dim cmd1 As New System.Data.SQLite.SQLiteCommand
        cmd1.Connection = conn
        cmd1.CommandType = CommandType.Text
        cmd1.CommandText = "SELECT * FROM Foo"
        Dim dt1 As New DataTable()
        Dim adp1 As New System.Data.SQLite.SQLiteDataAdapter(cmd1)
        adp1.Fill(dt1)
        ComboBox2.DataSource = dt1
        ComboBox2.ValueMember = dt1.Columns(1).ToString
        ComboBox2.DisplayMember = dt1.Columns(0).ToString
    End Sub

【讨论】:

    猜你喜欢
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多