Почему мой настроенный lookupEdit выдает следующую ошибку - PullRequest
0 голосов
/ 15 сентября 2011

Ошибка: индекс выходит за пределы диапазона Должен быть неотрицательным и меньше размера коллекции

У меня есть настроенный LookUpEdit -

public class MyLookUpEdit : LookUpEdit

Я ссылаюсь на следующую ссылку, чтобы добавить MyLookUpEdit на ленту. Теперь MyLookUpEdit доступен в моей лентеPageGroup -> Добавить редактор.

http://www.devexpress.com/Support/Center/KB/ViewKBIssue.aspx?kbid=A1237

Вот метод InitializeControl для MyLookUpEdit:

public void InitializeControl(ICollection cache, string columnField1, string columnField2, string valueField, bool isMultiColumn, int searchColumn)
        {
            Properties.ForceInitialize();
            const int maxDropDownSize = 7;
            Properties.Columns.Clear();

        if(isMultiColumn)
        {
                Properties.Columns.AddRange(new[] {
                new LookUpColumnInfo(columnField1, columnField1, columnField1.Length*6, FormatType.None, "", true, HorzAlignment.Near, DevExpress.Data.ColumnSortOrder.None),
                new LookUpColumnInfo(columnField2, columnField2, 100, FormatType.None, "", true , HorzAlignment.Near, DevExpress.Data.ColumnSortOrder.None)});
                Properties.ShowHeader = true;
                Properties.PopupFormMinSize = new Size(0, 0);
                Properties.AppearanceDropDownHeader.TextOptions.HAlignment = HorzAlignment.Near;
                Properties.AutoSearchColumnIndex = searchColumn;
        }
        else
        {
                Properties.Columns.AddRange(new[]{
                new LookUpColumnInfo(columnField1, columnField1, 10, FormatType.None, "", true, HorzAlignment.Near, DevExpress.Data.ColumnSortOrder.None),
                new LookUpColumnInfo(columnField2, columnField2, 0, FormatType.None, "", false , HorzAlignment.Near, DevExpress.Data.ColumnSortOrder.None)});
                Properties.ShowHeader = false;
                Properties.PopupFormMinSize = new Size(10, 10); // set popup width to control width

                break;
        }

        Properties.ShowFooter = false;
        Properties.ShowLines = true;
        Properties.ValueMember = valueField;
        Properties.DisplayMember = columnField1;
        Properties.DataSource = cache;
        if (cache == null) return;
        Properties.DropDownRows = cache.Count > maxDropDownSize ? maxDropDownSize : cache.Count;

        ColumnBestFit();
        HideIcon();
    }

Но во время выполнения на ленте я не могу нажать кнопку и увидеть все доступные значения для lookupedit - похоже, что всплывающее окно не открыто, и когда я покидаю редактирование, следующий код выдает ошибку: 1014 *

    protected override void OnLeave(EventArgs e)
    {
        if (IsPopupOpen) 
        {
            ItemIndex = PopupForm.SelectedIndex;
            _selectfromPopup = true;
        }
    Properties.DisplayMember = Properties.Columns[0].Caption; // This line throw the error

        base.OnLeave(e);

        if (textChanged)
            OnLeaveWithChangedText(e);

    }

1 Ответ

1 голос
/ 15 сентября 2011

Могут быть разные причины, по которым список столбцов пуст, это зависит от всей цепочки событий и методов формы и так далее, но чтобы быть уверенным и использовать защитный подход (мой швейцарский армейский нож ;-))

просто поставьте проверку перед:

Properties.DisplayMember = Properties.Columns[0].Caption;

, чтобы выполнить эту строку только , если Properties.Columns.Length > 0

, это не решит все проблемы, но, как я понимаюэто прямо сейчас предотвратит это исключение, и ваш код продолжит работу (но в конечном итоге не будет делать именно то, что вы ожидаете от него, если ошибка находится где-то еще в том факте, что список не должен быть пустым).

...