Народ, 2 сутки ломаю голову...........
Как в DataGridViewComboBoxColumn запихнуть null, если колонка таблицы типа integer?
именно типа integer, а не string. потому что если string я могу это сделать.
специально для сего вопроса набросал пример:
там DataGridView с 4 колонками, 2 из которых отображают данные из одной колонки таблицы ( Type )
причем одна типа DataGridViewTextBoxColumn, а другая DataGridViewComboBoxColumn.
так вот в текстовое поле я могу вставить NULL, (скорее DBNull.Value) просто написав <NULL> либо нажав <Ctrl>+<0>.
а в комбобоксе при выборе -неизвестно- вставляется не null a -1, а при нажатии <Ctrl>+<0>, вообше вылетает ошибка System.FormatException.
вот пример (извиняйте, пример на С шарп-е):
using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
using System.Windows.Forms;
namespace GridComboForForum
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.Run(new MyTestForm());
}
}
class MyTestForm : Form
{
DataTable _table;
DataGridView _grid;
public MyTestForm()
{
this.Load += new EventHandler(frmExp_Load);
}
void frmExp_Load(object sender, EventArgs e)
{
this.Text = "Test form";
this.Width = 640;
this.Height = 300;
this.CreateTable();
this.FillData();
this.CreateGrid();
}
private void CreateGrid()
{
// сам грид
this._grid = new DataGridView();
this._grid.Width = 610;
this._grid.Height = 250;
this._grid.Location = new System.Drawing.Point(10, 10);
this._grid.AutoGenerateColumns = false;
this._grid.AllowUserToAddRows = false;
// колонки
// ID
DataGridViewTextBoxColumn colID = new DataGridViewTextBoxColumn();
colID.DataPropertyName = "ID";
colID.HeaderText = "ID";
colID.Width = 50;
this._grid.Columns.Add(colID);
// Type: вот тут я сделал 2 колонки грида связанные с одной колонкой таблицы : type
// первая колонка - текстовая, тут все понятно и все работает.
DataGridViewTextBoxColumn colTypeTxt = new DataGridViewTextBoxColumn();
colTypeTxt.DataPropertyName = "Type";
colTypeTxt.HeaderText = "Type (textbox)";
colTypeTxt.DefaultCellStyle.NullValue = "<NULL>";
colTypeTxt.ValueType = typeof(int);
this._grid.Columns.Add(colTypeTxt);
// а вот здесь "камень преткновения" комбобокс!!!
DataGridViewComboBoxColumn colTypeCombo = new DataGridViewComboBoxColumn();
colTypeCombo.DataPropertyName = "Type";
colTypeCombo.HeaderText = "Type (combobox)";
colTypeCombo.Width = 150;
colTypeCombo.DefaultCellStyle.NullValue = "-1";
colTypeCombo.Items.Add(new TypeItem(-1, "-неизвестно-"));
colTypeCombo.Items.Add(new TypeItem(1, "блондин"));
colTypeCombo.Items.Add(new TypeItem(2, "брюнет"));
colTypeCombo.Items.Add(new TypeItem(3, "шатен"));
colTypeCombo.DisplayMember = "Name";
colTypeCombo.ValueMember = "ID";
this._grid.Columns.Add(colTypeCombo);
// Name column
DataGridViewTextBoxColumn colName = new DataGridViewTextBoxColumn();
colName.DataPropertyName = "Name";
colName.HeaderText = "Name";
colName.Width = 150;
this._grid.Columns.Add(colName);
// set data source
this._grid.DataSource = this._table;
this.Controls.Add(this._grid);
}
// добавляем 3 человека
private void FillData()
{
DataRow row;
row = this._table.NewRow();
row["Type"] = 2;
row["Name"] = "Вася";
this._table.Rows.Add(row);
row = this._table.NewRow();
// в данном случае тип волос неизвестен
// row["Type"] = 1;
row["Name"] = "Петя";
this._table.Rows.Add(row);
row = this._table.NewRow();
row["Type"] = 1;
row["Name"] = "Коля";
this._table.Rows.Add(row);
}
private void CreateTable()
{
this._table = new DataTable();
// первичный ключ
DataColumn colId = new DataColumn("ID", typeof(int));
colId.AutoIncrement = true;
colId.AutoIncrementSeed = 1;
// какой-то классификатор ( к примеру тип волос )
DataColumn colType = new DataColumn("Type", typeof(int));
colType.AllowDBNull = true;
// имя человека
DataColumn colName = new DataColumn("Name", typeof(string));
_table.Columns.Add(colId);
_table.Columns.Add(colType);
_table.Columns.Add(colName);
DataColumn[] keys = new DataColumn[1];
keys[0] = colId;
_table.PrimaryKey = keys;
}
}
// класс для хранения типов чего-либо ( в данном случае типов волос )
public class TypeItem
{
private int _id;
private string _name;
public TypeItem(int id, string name)
{
this.ID = id;
this.Name = name;
}
public int ID
{
get { return this._id; }
set { this._id = value; }
}
public string Name
{
get { return this._name; }
set { this._name = value; }
}
public override string ToString()
{
return this.ID.ToString() + " - " + this.Name;
}
}
}
Заранее благодарен.
Ответить
|