DataRowView 而不是值

DataRowView instead of value

每当我尝试 运行 我的应用程序时都会收到错误消息,因为我没有获得 comboBox.SelectedValue 的实际值,而是获得了 DataRowView 项。

这是我遇到错误的代码:

private void InitDataGridView()
{
    query = "SELECT p.name, p.age FROM Person p INNER JOIN Class c ON p.idC=c.idC WHERE p.id=" 
            + comboBoxClass.SelectedValue;
    command = new SqlCommand(query, connection);
    adapter = new SqlDataAdapter(command);
    datatable = new DataTable();
    adapter.Fill(datatable);
    dataGridViewStudents.DataSource = datatable;
}

comboBoxClass.SelectedValue 应该 return 我 "idC" 因为我设置了 DataSourceDisplayMember 和 (ValueMember -> idC).

idC是主键(int)。

ComboBox设置:

comboBoxClass.DataSource = datatable;
comboBoxClass.DisplayMember = "className";
comboBoxClass.ValueMember = "idC";

未绑定或不正确绑定 ValueMember 可能会产生您所描述的确切效果。正如您在下面的代码片段中看到的那样。

ComboBox 的初始化中放置一些断点,并弄清楚为什么 ValueMember 不是您需要的。那么您的 DataGridView 应该会正确填充。

using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;

namespace BindingToDataTable_46914296
{


    public partial class Form1 : Form
    {
        ComboBox combob = new ComboBox();
        ComboBox combobFail = new ComboBox();
        TextBox txtbx = new TextBox();
        public Form1()
        {
            InitializeComponent();
            InitComboBox();
            InitComboBoxFail();
            InitTxtBx();
        }

        private void InitTxtBx()
        {
            txtbx.Location = new Point(5, 30);
            txtbx.Width = this.Width - 10;
            this.Controls.Add(txtbx);
        }

        /// <summary>
        /// This version works, the proper selected value shows up in the textbox
        /// </summary>
        private void InitComboBox()
        {
            combob.Location = new Point(5,5);
            this.Controls.Add(combob);

            DataTable dt = new DataTable();
            dt.Columns.Add(new DataColumn("Col1", typeof(string)));
            dt.Columns.Add(new DataColumn("Col2", typeof(string)));
            dt.Columns.Add(new DataColumn("Col3", typeof(string)));
            dt.Columns.Add(new DataColumn("Col4", typeof(Int32)));
            dt.Rows.Add("blah1", "bleh", "bloh", 1);
            dt.Rows.Add("blah2", "bleh", "bloh", 2);
            dt.Rows.Add("blah3", "bleh", "bloh", 3);
            dt.Rows.Add("blah4", "bleh", "bloh", 4);
            combob.DataSource = dt;
            combob.DisplayMember = "Col1";
            combob.ValueMember = "Col4";

            combob.SelectedValueChanged += Combob_SelectedValueChanged;
        }


        /// <summary>
        /// This version DOES NOT work, a DataRowView item appears in the textbox when the selection changes
        /// </summary>
        private void InitComboBoxFail()
        {
            combobFail.Location = new Point(combob.Location.X + combob.Width + 5, 5);
            this.Controls.Add(combobFail);

            DataTable dt = new DataTable();
            dt.Columns.Add(new DataColumn("Col1", typeof(string)));
            dt.Columns.Add(new DataColumn("Col2", typeof(string)));
            dt.Columns.Add(new DataColumn("Col3", typeof(string)));
            dt.Columns.Add(new DataColumn("Col4", typeof(Int32)));
            dt.Rows.Add("blah1", "bleh", "bloh", 1);
            dt.Rows.Add("blah2", "bleh", "bloh", 2);
            dt.Rows.Add("blah3", "bleh", "bloh", 3);
            dt.Rows.Add("blah4", "bleh", "bloh", 4);
            combobFail.DataSource = dt;
            combobFail.DisplayMember = "Col1";
            //only difference is I am not binding ValueMember

            combobFail.SelectedValueChanged += Combob_SelectedValueChanged;
        }

        private void Combob_SelectedValueChanged(object sender, EventArgs e)
        {
            txtbx.Text = ((ComboBox)sender).SelectedValue.ToString();
        }
    }
}

好的,我发现我的代码出了什么问题。这既不是 comboBox 初始化也不是 dataGridView 的初始化,但这完全是我写下错误查询的错。

感谢大家对我的帮助。