Элемент репозитория DevExpress lookupedit добавить новую строку в Xtra Grid View в первой строке

У меня есть gridcontrol devexpress с 5 столбцами. Первый столбец — это репозиторий lookupedit с некоторыми данными, скажем, с CarTypes. Для загрузки данных в сетку я использую файл BindingSource. В этом BindingSource.DataSource я загрузил IList<Cars>

а затем добавил этот источник привязки в dataSource моего gridcontrol, как показано ниже

BindingSource _carsBindingSource = new BindingSource();

private void BindData(IList<Cars> data)
{
            _carsBindingSource.DataSource = data;

            carsGridControl.BeginUpdate();
            carsGridControl.DataSource = _carsBindingSource;
            carsGridControl.RefreshDataSource();
            carsGridControl.EndUpdate();
 }

У меня есть кнопка, чтобы добавить новую строку в мою сетку «Добавить новую машину» и добавить новую строку в _carBindingSource

    private void AddNewRow()
    {
                _newRow = true;
                _carsBindingSource.AllowNew = true;
                Cars newCar = new Cars();
                newCar.CarType = new CarType();            
                _carsBindingSource.Add(newCar );
                //_carsBindingSource.Insert(0,newCar);


   }

Теперь я хочу добавить новую строку в первую строку сетки.

Я использую Insert

_carsBindingSource.Insert(0,newCar);

Но это не сработало. lookupedit repository не может загрузить данные.

С _carsBindingSource.Add(newCar); работает нормально

Может кто-нибудь помочь мне? Спасибо!


person A. Zalonis    schedule 03.12.2015    source источник
comment
что означает эта строчка??? Теперь вы хорошо написали свой вопрос, но все еще не ясно, о чем вы спрашиваете.   -  person Niranjan Singh    schedule 03.12.2015
comment
Вы правы @NiranjanKala. На самом деле я хочу добавить новую строку в свой carsBindingSource, НО в первую строку сетки. Я использую carsBindingSource.Insert(0,newCar), но работает неправильно   -  person A. Zalonis    schedule 04.12.2015
comment
На самом деле я нашел решение. Проблема заключалась в событии GridView_CustomRowCellEdit (отправитель объекта, CustomRowCellEditEventArgs e), где я изменяю значение AllowEdit (e.Column.OptionsColumn.AllowEdit = true;). .Добавить(объект), .Вставить(0,объект) то же самое!   -  person A. Zalonis    schedule 04.12.2015


Ответы (2)


Если вы еще этого не сделали, рассмотрите возможность использования промежуточного списка для ваших типов автомобилей:

private List<CarTypes> _CarTypes;

// Elsewhere in the code...
_CarTypes = GetCarTypes();

А затем в событии загрузки формы убедитесь, что оно привязано к источнику данных:

repositoryLookupItemCarTypes.DataSource = _CarTypes;

При этом сетка теперь должна автоматически управлять созданием и выбором объекта CarType для каждого объекта Cars. Вы можете опустить эту строку при добавлении автомобиля в сетку:

newCar.CarType = new CarType(); 

В дизайнере, я думаю, полезно изменить свойство DisplayMember элемента репозитория.

С этой настройкой любой автомобиль, добавленный в вашу сетку, должен автоматически иметь CarType в качестве заполненного Lookup Edit.

Если что-то из этого непонятно, дайте мне знать. Я сделал быстрое и грязное решение, чтобы проверить это, и я, очевидно, не могу опубликовать его все, но я могу сказать вам, что оно работало как с Add, так и с Insert.

person Hambone    schedule 04.12.2015
comment
Спасибо за ваш ответ. Но все это у меня уже есть. С BindingSource.Add(newCar) работает нормально, но проблема в том, что новая строка идет в конце строки сетки, и я хочу добавить в первую строку. С Insert(0,newCar) он переходит в первую строку, но я должен много раз щелкать в других столбцах, пока не перезагружу данные в хранилище lookupedit, я пробую команду bindSource.AddNew() с Insert и теперь добавляю 2 строки. Один в первом ряду и ряд в конце сетки, но теперь работает! я не могу понять что происходит - person A. Zalonis; 04.12.2015
comment
По крайней мере, я рад, что это работает. Что бы это ни стоило, вы можете добавить источник привязки во время разработки (в форме), а не в коде. Возможно, вы так и сделали и показали код только для иллюстрации, но на всякий случай... - person Hambone; 04.12.2015

На самом деле я нашел решения. Проблема заключалась в событии GridView_CustomRowCellEdit (отправитель объекта, CustomRowCellEditEventArgs e), где я изменяю значение AllowEdit (e.Column.OptionsColumn.AllowEdit = true;).

private void gridView_CustomRowCellEdit(object sender, CustomRowCellEditEventArgs e)
{
    string cName = e.Column.FieldName;
    GridView gv = sender as GridView;

    if (cName == "CarType.IdApi")
    {
        if (isNewRow)
        {
            Cars cars= (Cars)gv.GetRow(e.RowHandle);

            int a = e.RowHandle;
            if (cars.ID== 0 && e.RowHandle == 0)
            {
               e.Column.OptionsColumn.AllowEdit = true;
            }
            else
            {
               e.Column.OptionsColumn.AllowEdit = false;
            }
         }        
     }
}

Когда я использую Insert(0, new Car), то из-за второй строки, которая имеет значение, AllowEdit было ложным; Итак, я удаляю код else, и он работает

private void gridView_CustomRowCellEdit(object sender, CustomRowCellEditEventArgs e)
    {
        string cName = e.Column.FieldName;
        GridView gv = sender as GridView;

        if (cName == "CarType.IdApi")
        {
            if (isNewRow)
            {
                Cars cars= (Cars)gv.GetRow(e.RowHandle);

                int a = e.RowHandle;
                if (cars.ID== 0 && e.RowHandle == 0)
                {
                   e.Column.OptionsColumn.AllowEdit = true;
                }
             }        
         }
    }

Итак, наконец, я обнаружил, что bindingSource.Add(object) и bindingSource.Insert(0,object) одинаковы!

Прошу прощения за мой английский!!

person A. Zalonis    schedule 04.12.2015