C # DataGridView Десятичный столбец ComboBox - PullRequest
1 голос
/ 16 ноября 2011

У меня есть сетевое представление со связанным столбцом комбинированного списка, который содержит десятичное значение. Существует ряд допустимых десятичных значений, поэтому пользователь может выбрать одно из них. Однако я сталкиваюсь со странной проблемой - когда вы нажимаете на выпадающий список в выбранном значении, он каким-то образом сбрасывается на первый в списке, теряя уже выбранный. Посмотри на картинки

Это начальный вид окна:

enter image description here

Это когда я выбираю аналогичный столбец с двойным значением в нем (обратите внимание на выбор в списке в выпадающем списке) enter image description here

Это когда я выбираю столбец с десятичным значением. Выбор (номер 293) отсутствует

enter image description here

Вот код, который я использую:

        public Form1()
        {
            InitializeComponent();

            dgwResult.AutoGenerateColumns = false;
            var list = new List<string>(){"A", "B", "C", "D"};
            var list2 = new List<double>();
            var list3 = new List<decimal>();
            for (int i = 0; i < 300; i++)
            {
                list2.Add((double)i);
                list3.Add((decimal)i);
            }
            dgw_2.DataSource = list;
            dgw_2.DataPropertyName = "two";
            dgw_3.DataSource = list2;
            dgw_3.DataPropertyName = "three";
            dgw_4.DataSource = list3;
            dgw_4.DataPropertyName = "four";
            DataTable dt = new DataTable();
            dt.Columns.Add("one", typeof(string));
            dt.Columns.Add("two", typeof(string));
            dt.Columns.Add("three", typeof(double));
            dt.Columns.Add("four", typeof(decimal));
            dt.Rows.Add(new object[] { "akjsgdf", "A", 10.0, 10.0m });
            dt.Rows.Add(new object[] { "akjsgdf", "B", 15.0, 15.0m });
            dt.Rows.Add(new object[] { "akjsgdf", "C", 20.0, 20.0m });
            dt.Rows.Add(new object[] { "akjsgdf", "D", 15.0, 15.0m });
            dt.Rows.Add(new object[] { "akjsgdf", "C", 293.0, 293.0m });
            dgwResult.DataSource = dt;
        }

private void InitializeComponent()
        {
            this.dgwResult = new System.Windows.Forms.DataGridView();
            this.dgw_1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.dgw_2 = new System.Windows.Forms.DataGridViewComboBoxColumn();
            this.dgw_3 = new System.Windows.Forms.DataGridViewComboBoxColumn();
            this.dgw_4 = new System.Windows.Forms.DataGridViewComboBoxColumn();
            ((System.ComponentModel.ISupportInitialize)(this.dgwResult)).BeginInit();
            this.SuspendLayout();
            // 
            // dgwResult
            // 
            this.dgwResult.AllowUserToAddRows = false;
            this.dgwResult.AllowUserToDeleteRows = false;
            this.dgwResult.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
            this.dgwResult.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
            this.dgwResult.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
            this.dgw_1,
            this.dgw_2,
            this.dgw_3,
            this.dgw_4});
            this.dgwResult.Location = new System.Drawing.Point(12, 12);
            this.dgwResult.Name = "dgwResult";
            this.dgwResult.RowHeadersVisible = false;
            this.dgwResult.Size = new System.Drawing.Size(268, 150);
            this.dgwResult.TabIndex = 0;
            this.dgwResult.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgwResult_CellClick);
            // 
            // dgw_1
            // 
            this.dgw_1.DataPropertyName = "one";
            this.dgw_1.HeaderText = "One";
            this.dgw_1.Name = "dgw_1";
            // 
            // dgw_2
            // 
            this.dgw_2.DataPropertyName = "two";
            this.dgw_2.HeaderText = "Two";
            this.dgw_2.Name = "dgw_2";
            // 
            // dgw_3
            // 
            this.dgw_3.DataPropertyName = "three";
            this.dgw_3.HeaderText = "Double";
            this.dgw_3.Name = "dgw_3";
            // 
            // dgw_4
            // 
            this.dgw_4.DataPropertyName = "four";
            this.dgw_4.HeaderText = "Decimal";
            this.dgw_4.Name = "dgw_4";
            this.dgw_4.Resizable = System.Windows.Forms.DataGridViewTriState.True;
            this.dgw_4.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(292, 273);
            this.Controls.Add(this.dgwResult);
            this.Name = "Form1";
            this.Text = "Form1";
            ((System.ComponentModel.ISupportInitialize)(this.dgwResult)).EndInit();
            this.ResumeLayout(false);

        }

        private System.Windows.Forms.DataGridView dgwResult;
        private System.Windows.Forms.DataGridViewTextBoxColumn dgw_1;
        private System.Windows.Forms.DataGridViewComboBoxColumn dgw_2;
        private System.Windows.Forms.DataGridViewComboBoxColumn dgw_3;
        private System.Windows.Forms.DataGridViewComboBoxColumn dgw_4;

Может кто-нибудь указать, почему поведение так странно для десятичной? Может быть, я упускаю что-то простое здесь?

1 Ответ

0 голосов
/ 16 ноября 2011

Причина, по которой вы получаете эту «странную» операцию, заключается в том, что десятичных чисел нет в списке, используемом для заполнения столбца DataSource.

Проблема устранена путем изменения кода, заполняющего DataTable, следующим образом:

dt.Rows.Add(new object[] { "akjsgdf", "A", 10.0, 10m });
dt.Rows.Add(new object[] { "akjsgdf", "B", 15.0, 15m });
dt.Rows.Add(new object[] { "akjsgdf", "C", 20.0, 20m });
dt.Rows.Add(new object[] { "akjsgdf", "D", 15.0, 15m });
dt.Rows.Add(new object[] { "akjsgdf", "C", 293.0, 293m });

Я считаю, что DataGridView вызывает функцию .ToString() для каждого элемента в DataSource столбца, чтобы найти совпадение. Поскольку 1.0 не равно 1 (в строковом выражении), при открытии раскрывающегося меню поля со списком элемент не выбирается.

...