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"
因为我设置了 DataSource
、DisplayMember
和 (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
的初始化,但这完全是我写下错误查询的错。
感谢大家对我的帮助。
每当我尝试 运行 我的应用程序时都会收到错误消息,因为我没有获得 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"
因为我设置了 DataSource
、DisplayMember
和 (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
的初始化,但这完全是我写下错误查询的错。
感谢大家对我的帮助。