Редактирование текстового поля внутри datagridview - PullRequest
2 голосов
/ 10 января 2020

Мой проект имеет форму c# windows с Entity Framework, и у меня есть DataGridView с TextColumn. Я хочу редактировать последний столбец TextColumn Cells [3]. Получить все значения из базы данных в GridView не проблема. Я получаю их. И я могу поставить новое значение, но как только я нажму на другое место, оно изменится на старое. Текстовое поле не сохраняет новое значение, которое я хочу редактировать. ReadOnly имеет значение false для этих ячеек в столбце 3, потому что я могу написать, но изменяет новое значение на старое. Какие события мне не хватает и как мне сделать, чтобы решить эту проблему? Некоторым кажется, что дыра в Гридвью закрыта. Пожалуйста, помогите.

Я пробовал даже:

foreach (DataGridViewRow row in dgvOrder.Rows)
{   
   row.Cells[3].ReadOnly = false; 
} 

Здесь ниже мой код.

private void Treatments_Load(object sender, EventArgs e)
 { 
 try
            {
                using (MyHealthEntities db = new MyHealthEntities())
                { 
                    var  orderd = db.Order.Where(x => x.Ordernr == OrNr).FirstOrDefault();
                    if(orderd != null)
                    {
                        var myOrder = (from u in db.....
                                            join d in ...
                                            join m in ...
                                            where u.....
                                            select new
                                            {
                                                OrderId = m.MedId,
                                                Name = m. Name,
                                                Quality = m.Quality,
                                                Description = d.Description

                                            }
                                        ).ToList();
                        if (myOrder != null)
                        {


                            dgvOrder.DataSource = myOrder ;
                        }
                    }
                    foreach (DataGridViewRow row in dgvOrder.Rows)
                    {   
                       row.Cells[3].ReadOnly = false; 
                    } 

                } 

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);

            }

        }

}

Ответы [ 2 ]

2 голосов
/ 10 января 2020

Если я не ошибаюсь, обычный System.Collections.Generi c .List не будет поддерживать редактирование при прямой привязке, поскольку он не реализует IBindingList (или необходимое событие ListChanged) для двустороннего связывания данных. Скорее всего, вам нужно будет обернуть список в BindingList, чтобы редактировать значения. Это невозможно при использовании анонимного типа.

Сначала создайте класс для хранения элементов списка:

public Class Order {
    public int OrderID { get; set; }
    public string Name { get; set; }
    public byte Quality { get; set; }
    public string Description { get; set; }
}

Затем в своем запросе

select new Order
{
    OrderId = m.MedId,
    Name = m. Name,
    Quality = m.Quality,
    Description = d.Description
}

Теперь переместите его в BindingList:

if (myOrder != null) {
   BindingList<Order> myBindingList = New BindingList<Order>(myOrder);
   dgvOrder.DataSource = myBindingList;
}

Я бы также рекомендовал обернуть BindingList в BindingSource, что избавит вас от необходимости обрабатывать строки, добавляемые / удаляемые вручную:

if (myOrder != null) {
   BindingList<Order> myBindingList = New BindingList<Order>(myOrder);
   BindingSource myBindingSource = New BindingSource(myBindingList);
   dgvOrder.DataSource = myBindingSource;
}

Извиняюсь, если мой синтаксис немного нарушен, я в основном использовал vb в последнее время.

РЕДАКТИРОВАТЬ: я пропустил, что BindingList не реализует IContainer, поэтому приведенный выше код для привязки к BindingSource не будет работать, потому что однопараметрический конструктор для BindingSource специально принимает IContainer. Если вы все еще хотите использовать BindingSource, вместо этого следует использовать третий конструктор BindingSource, например:

BindingSource myBindingSource = New BindingSource(myBindingList, Nothing);

BindingSource принимает привязку к IBindingList, но только с помощью этого конструктора или путем прямой установки свойства .DataSource после использования параметров конструктор Оставив вышеприведенный ошибочный код, чтобы другие, кто прочитал комментарий ОП, поняли, на что ссылались.

0 голосов
/ 10 января 2020

Вы не можете редактировать DataGrid itens, когда используете «dgvOrder.DataSource = myOrder».

Я предлагаю вам сделать «и для каждого» в списке myOrder и добавить ряд за строкой в ​​сетку. После этого вы можете сделать другое «для каждого», восстановить данные из DataGrid и сохранить их в своем db.Order.

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