Как программно установить значение ячейки в DataGridView? - PullRequest
37 голосов
/ 04 октября 2009

У меня есть DataGridView. Некоторые из ячеек получают свои данные от последовательного порта: я хочу поместить данные в ячейку и обновить их базовый связанный объект.

Я пытаюсь что-то вроде этого:

SetValueFromSerial (decimal newValue)
{
    dataGridView.CurrentCell.Value = newValue;
}

использование строки не помогает:

    dataGridView.CurrentCell.Value = newValue.ToString ();

В обоих случаях я ничего не вижу в сетке, и базовое значение не изменяется.

Я сделал Google и начал поиск, но ничего не нашел. (Возможно, я что-то пропустил, возможно, что-то очевидное, но я не совершенно ленивый.)

Ответы [ 14 ]

1 голос
/ 20 апреля 2013

Следующие работы. Возможно, я ошибаюсь, но добавление значения String кажется несовместимым с ячейкой DataGridView (хотя я не экспериментировал и не пытался взломать).

DataGridViewName.Rows[0].Cells[0].Value = 1;
0 голосов
/ 01 ноября 2016

Я перепробовал много методов, и единственный, который работал, был UpdateCellValue:

dataGridView.Rows[rowIndex].Cells[columnIndex].Value = "New Value";
dataGridView.UpdateCellValue(columnIndex, rowIndex);

Я надеюсь, что помог. =)

0 голосов
/ 25 февраля 2014
private void btn_Addtoreciept_Click(object sender, EventArgs e)
{            
    serial_number++;
    dataGridView_inventory.Rows[serial_number - 1].Cells[0].Value = serial_number;
    dataGridView_inventory.Rows[serial_number - 1].Cells[1].Value =comboBox_Reciept_name.Text;
    dataGridView_inventory.Rows[serial_number - 1].Cells[2].Value = numericUpDown_recieptprice.Value;
    dataGridView_inventory.Rows[serial_number - 1].Cells[3].Value = numericUpDown_Recieptpieces.Value;
    dataGridView_inventory.Rows[serial_number - 1].Cells[4].Value = numericUpDown_recieptprice.Value * numericUpDown_Recieptpieces.Value;
    numericUpDown_RecieptTotal.Value = serial_number;
}

в первый раз все идет хорошо, но нажатие во второй раз вызывает ошибку Индекс был вне диапазона. Должен быть неотрицательным и меньшим, чем размер коллекции. Имя параметра: индекс ", но когда я нажимаю на ячейку, появляется другая строка, а затем она работает для следующей строки и продолжает ...

0 голосов
/ 06 декабря 2013

Как сказал @Thomas, элемент, который вы хотите изменить, должен реализовывать INotifyPropertyChanged. Но источник данных также важен. Это должен быть BindingList, который вы можете легко создать из List.

Вот мой пример - источником данных является сначала DataTable, который я передаю в List, а затем создаю BindingList. Затем я создаю BindingSource и использую BindingList в качестве источника данных из BindingSource. Наконец, DataSource из DataGridView использует этот BindingSource.

 sp_Select_PersonTableAdapter adapter = new sp_Select_PersonTableAdapter();

 DataTable tbl = new DataTable();
 tbl.Merge(adapter.GetData());

 List<Person> list = tbl.AsEnumerable().Select(x => new Person
 {
     Id = (Int32) (x["Id"]),
     Ime = (string) (x["Name"] ?? ""),
     Priimek = (string) (x["LastName"] ?? "")
 }).ToList();

 BindingList<Person> bindingList = new BindingList<Person>(list);

 BindingSource bindingSource = new BindingSource();
 bindingSource.DataSource = bindingList;
 dgvPerson.DataSource = bindingSource;

Что также очень важно: каждый член класса должен устанавливать OnPropertyChanged (). Без этого это не сработает. Итак, мой класс выглядит так:

public class Person : INotifyPropertyChanged
    {
        private int _id;
        private string _name;
        private string _lastName;

        public int Id
        {
            get { return _id; }
            set
            {
                if (value != _id)
                {
                    _id = value;
                    OnPropertyChanged();
                }
            }
        }
        public string Name
        {
            get { return _name; }
            set
            {
                if (value != _name)
                {
                    _name = value;
                    OnPropertyChanged();
                }
            }
        }
        public string LastName
        {
            get { return _lastName; }
            set
            {
                if (value != _lastName)
                {
                    _lastName= value;
                    OnPropertyChanged();
                }
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;

        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }

    }

Еще по этой теме: http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...