Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница:

 

  Вопрос: DataGridViewComboBoxColumn, and DBNull.Value Добавлено: 23.09.08 20:39  

Автор вопроса:  Shota
Народ, 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;
        }
    }
}
 



Заранее благодарен.

Ответить

  Ответы Всего ответов: 0  

Нет ответов

Страница:

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам