我正试图在DataGridView中设置一些东西。这看起来应该很简单,但我有麻烦了。我想显示三列:
我希望能够从所有可能的TypeName值中进行选择。这是我的困境:
如果我将所有这些加载到一个DataTable中,并将DataGridView设置为DataSource,则可以显示该记录的现有TypeName,但是组合框将不包含任何其他值。如果我将DataGridViewComboBoxColumn的DataGridViewComboBoxColumn设置为包含所有可能的TypeNames的单独DataTable,则不会显示现有的值。
DataGridView使用起来真的很烦人,所以最好有一个解决方案,或者一个可行的替代方案。
编辑:这个问题似乎是因为我想要一个单独的项目为DisplayMember和ValueMember。如果我不担心将ID设置为ValueMember,下面的工作是可行的
var typeColumn = new DataGridViewComboBoxColumn
{
DataSource = typeList,
DisplayMember = "Type",
ValueMember = "Type",
DataPropertyName = "Type"
}如果执行以下操作,将选择正确的类型,但无法更改组合框中的选择:
var typeColumn = new DataGridViewComboBoxColumn
{
DataSource = typeList,
DisplayMember = "Type",
ValueMember = "TypeID",
DataPropertyName = "TypeID"
}如果使用以下内容,将得到一个FormatException错误,因为它试图填充:
var typeColumn = new DataGridViewComboBoxColumn
{
DataSource = typeList,
DisplayMember = "Type",
ValueMember = "TypeID",
DataPropertyName = "Type"
}编辑:typeList是由以下内容填充的简单DataTable:
SELECT DISTINCT IT.InsuranceTypeID, IT.[Type]
FROM InsuranceType IT
WHERE IT.ClientID = @ClientID
ORDER BY [Type]发布于 2011-10-06 21:06:50
好的,我想出了一个例子ClientInfo和InsuranceDetails,我认为它们可能模仿你想要做的事情。如果这些细节不完全正确,请告诉我。此示例将填充DataGridViewComboBox并根据InsuranceDetails设置值(特别是at:InsurDetailz = all_insurance_types[2])。
public partial class Form1 : Form
{
private ClientInfo _myClient;
private BindingList<InsuranceDetails> all_insurance_types =
new BindingList<InsuranceDetails>();
public Form1()
{
InitializeComponent();
DataGridView grid = new DataGridView();
grid.Dock = DockStyle.Fill;
grid.AutoGenerateColumns = true;
all_insurance_types.Add(new InsuranceDetails(1, "Health"));
all_insurance_types.Add(new InsuranceDetails(2, "Home"));
all_insurance_types.Add(new InsuranceDetails(3, "Life"));
var col = new DataGridViewComboBoxColumn
{
DataSource = all_insurance_types,
HeaderText = "Insurance Type",
DataPropertyName = "InsurDetailz",
DisplayMember = "ItType",
ValueMember = "Self",
};
_myClient = new ClientInfo {
InsurDetailz = all_insurance_types[2], Name = "Jimbo" };
grid.Columns.Add(col);
grid.DataSource = new BindingList<ClientInfo> { _myClient };
this.Controls.Add(grid);
this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
}
void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// make sure its updated
InsuranceDetails c = _myClient.InsurDetailz;
string name = _myClient.Name;
// Place breakpoint here to see the changes in _myClient
throw new NotImplementedException();
}
}
class ClientInfo
{
public string Name { get; set; }
public InsuranceDetails InsurDetailz { get; set; }
}
class InsuranceDetails
{
public int InsuranceTypeID { get; set; }
public String ItType { get; set; }
public InsuranceDetails Self { get { return this; } }
public InsuranceDetails(int typeId, String itType)
{
this.InsuranceTypeID = typeId;
this.ItType = itType;
}
}发布于 2011-10-05 19:43:11
我有一个类似的问题(我认为),我的解决方案是为DataGridViewComboBoxColumn 设置DataGridViewComboBoxColumn,然后为DataGridView设置DataSource。
在我的例子中,我的DataSources分别是一个List<T>和一个BindingList<T>,但是它应该与DataTables一样工作:
DataGridViewComboBoxColumn categoryColumn = (DataGridViewComboBoxColumn)_ItemsGrid.Columns["CategoryID"];
categoryColumn.DataSource = categories;
_ItemsGrid.DataSource = items;https://stackoverflow.com/questions/7666461
复制相似问题