Ваш браузер устарел, не поддерживает современные веб-стандарты и представляет угрозу Вашей безопасности. Для комфортной работы с порталом, пожалуйста, установите современыый браузер.
Портал технической поддержки

Открыть редактирование поля карточки в обход ролевой модели

С ответом

Комментарии

Комментариев: 3

  • Официальный комментарий

    Тут нужно зайти с другой стороны - изначально делаем элемент управления доступным для всех (в идеале зависящим только от операции Запись) и по нужным условиям скрываем или запрещаем редактирование непосредственно в контроле элемента, н-р, получаем его как DevExpress.XtraEditors.ButtonEdit и закрываем редактирование через item.Properties.ReadOnly = true;

    Причем, в данном варианте никто не мешает пользоваться состояниями, ролями (н-р, проверкой через IStateService.IsOperationAllowedFull) и т.д.

    Действия с комментариями Постоянная ссылка
  • хм... возможно...

    из хорошего конечно то, что не надо разметку обновлять...

    только есть пара нюансов:

    1. не очень универсально... надо получить конкретный вид... в частности ButtonEdit, а если речь идёт о своих элементах разметки (причём не DevExpress)...

    2. а если завтра скажут - а давайте в согласование параллельно добавим Бухгалтера 1С... и пусть он будет редактировать поле Наименование для 1С... дописывать код не охота... сейчас достаточно роль в маршрут согласования добавить (у нас не стандартный конструктор согласования) и в роли указать вид карточки и имя поля.

    ... да и закрывать поле как-то политически не правильно... лучше когда оно закрыто при необходимости открыть...

    надо подумать...

    0
    Действия с комментариями Постоянная ссылка
  • подумал ))

    спасибо, за указанное направление )

    сделал так:

    // получаем открытые поля роли по виду карточки
    KindsCardKind kckKind = Helper.BaseCard.SystemInfo.CardKind;
    string sQuery = "<ConditionGroup Alias=\"alias0\" Operation=\"OR\">" +
        "<Condition Alias=\"alias1\"><Field FieldType=\"refid\">Kind</Field><Op>EQ</Op><Value>'" +
        Helper.GetGuidObject(kckKind) + "'</Value></Condition>" +
        "</ConditionGroup><Options Limit=\"-1\"/>";
    RowDataCollection rdcAccess = sdAccess.FindRows(sQuery);
     
    // открытые поля в настройках
    List<string> lsAccess = new List<string>();
    foreach (RowData rdAccess in rdcAccess)
    {
        string sField = rdAccess["AccessFields"].ToString().Trim();
        if (!String.IsNullOrWhiteSpace(sField))
        {
            lsAccess.Add(sField);
        }
    }
     
    // ищем / открываем элементы разметки
    foreach (var vLayout in Helper.BaseCardControl.Controls)
    {
        System.Windows.Forms.Control cLayuot = vLayout as System.Windows.Forms.Control;
        if (cLayuot != null)
        {
            if (cLayuot.Name.Equals("mainLayoutEx"))
            {
                foreach (var vControl in cLayuot.Controls)
                {
                    System.Windows.Forms.Control cControl = vControl as System.Windows.Forms.Control;
                    if (cControl != null && lsAccess.Contains(cControl.Name))
                    {
                        DocsVision.BackOffice.WinForms.Design.PropertyControls.IPropertyControl ipc = vControl as DocsVision.BackOffice.WinForms.Design.PropertyControls.IPropertyControl;
                        if (ipc != null)
                            ipc.AllowEdit = true;
                    }
                }
            }
        }
    }

     

    работает замечательно, без всякого обновления разметки...

    только если поля открывать при открытии карточки, то по событию BaseCardControl.CardActivated, чтобы после применения ролевой модели.

     

     

     

     

     

    0
    Действия с комментариями Постоянная ссылка

Войдите в службу, чтобы оставить комментарий.