none
Помогите разобраться с PickerDialog. RRS feed

  • Общие обсуждения

  • Создаю свой тип поля, который должен работать как PickerDialog.

    Делал, основываясь на этом вот блоге Виталя Жукова.

    на форме, поле отображается, а вот при попытке нажать на книжку, чтобы открыть диалоговое окно поиска, появляется сообщение об ошибке в форме где должен быть отображен PickerDialog, именно он не отображается, но почему не понятно, ошибка выглядит так:
    ОШИБКА СЕРВЕРА В ПРИЛОЖЕНИИ '\'.
    Ошибка выполнения.
    На серевре возникла ошибка приложения. Текущая особая настройка ошибок для этого приложения не позволяет отобразить сведения об ошибке данного приложения.
    и далее текст о том как сделать настройку для показа ошибок, хотя такие настройки уже есть давно.(внес во всех web.config какие нашел)

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

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

    // класс самого поля.
    public class SearchTextBoxField : SPFieldText
        {
            public SearchTextBoxField(SPFieldCollection fields, string name) : base(fields, name) { }
            public SearchTextBoxField(SPFieldCollection fields, string name, string displayname) : base(fields, name, displayname) { }
            public override Microsoft.SharePoint.WebControls.BaseFieldControl FieldRenderingControl
            {
                get
                {
    //breakpoint
                    SearchTextBoxFieldControl ctrl = new SearchTextBoxFieldControl();
                    ctrl.FieldName = this.InternalName;
                    return ctrl;
                }
            }
        }
    // контрол для поля.
       public class SearchTextBoxFieldControl : BaseFieldControl
        {
            private SearchTextBoxPicker _picker;
          //  TextBox oTb;
            SPList listsearch;
            string[] treefld;
            protected override string DefaultTemplateName { get { // breakpoint
     return "SearchTextBoxRenderingTemplate"; } }
            //public override object Value { get { return oTb.Text; } set { oTb.Text = (string)value; } }
            [SharePointPermission(System.Security.Permissions.SecurityAction.Demand, ObjectModel = true)]
            protected override void CreateChildControls()
            {
    // breakpoint
                base.CreateChildControls();
           //     oTb = null;
                if (ControlMode == SPControlMode.Edit || ControlMode == SPControlMode.New)
                {
              //      oTb = (TextBox)this.TemplateContainer.FindControl("searchtextbox");
                    //oTbName = (TextBox)this.TemplateContainer.FindControl("BaseName");
                    string _name = (string)Field.GetCustomProperty("GuidList");
                    Guid guid = new Guid(_name);
                    if (guid == null) return;
                    _name = (string)Field.GetCustomProperty("GroupFieldNames");
                    _name = _name.Replace("\r", "");
                    _name = _name.Replace("\n", ",").Trim();
                    if (_name.Length > 0) treefld = _name.Split(',');
                    listsearch = Web.Lists[guid];
                    _picker = new SearchTextBoxPicker();
                    _picker.List = listsearch;
                    if (treefld != null)
                    {
                        foreach (string name in treefld)
                        {
                            if (!string.IsNullOrEmpty(name.Trim())) _picker.ShowColumns.Add(name.Trim());
                        }
                    }
                    SetFieldControlValue(Page.IsPostBack ? Value : ItemFieldValue);
                }
            }
            public override void Validate()
            {
                base.Validate();
            }
            public override object Value
            {
                get
                {
                    EnsureChildControls();
                    //SPFieldMultiChoiceValue val = new SPFieldMultiChoiceValue();
                    string ret ="";
                    foreach (PickerEntity it in _picker.ResolvedEntities)
                    {
                        if (it.IsResolved) { ret = it.DisplayText; break; }
                    }
                    
                    return ret;
                }
                set
                {
                    EnsureChildControls();
                    SetFieldControlValue(value);
                }
            }
            private void SetFieldControlValue(object value)
            {
    // breakpoint
                Controls.Add(_picker);
                _picker.Entities.Clear();
                var list = new ArrayList();
                if (ControlMode == SPControlMode.New && _picker.Entities.Count == 0)
                {
                    // Default value
                }
                else
                {
                    if (value != null && value.GetType().Name == typeof(string).Name)
                    {
                        PickerEntity pk = new PickerEntity();
                        pk.DisplayText = (string)value;
                        list.Add(pk);
                    }
                }
                _picker.UpdateEntities(list);
            }
            public override void UpdateFieldValueInItem()
            {
                var val = string.Empty;
                if (_picker != null && _picker.ResolvedEntities.Count > 0)
                    ItemFieldValue = ((PickerEntity)_picker.ResolvedEntities[0]).DisplayText;
                base.UpdateFieldValueInItem();
            }
        }
    // классы необъодимые для работы PickerDialog
        public class SearchTreePickerDialog : PickerDialog
        {
            public SearchTreePickerDialog(PickerQueryControlBase query, PickerResultControlBase result, EntityEditorWithPicker editor, bool fPeoplePicker)
                : base(query, result,editor, fPeoplePicker)
            {
            }
            public SearchTreePickerDialog(PickerQueryControlBase query, PickerResultControlBase result, EntityEditorWithPicker editor)
                : base(query, result, editor)
            {
    //breakpoint
    } public SearchTreePickerDialog() : base(new TextBoxSearcher(), new TableResultControl(), new SearchTextBoxPicker()) { } } public class TextBoxSearcher : SimpleQueryControl { public TableResultControl ResultControl { get { return (TableResultControl)PickerDialog.ResultControl; } } public SearchTextBoxPicker EditorControl { get { return (SearchTextBoxPicker)PickerDialog.EditorControl; } } public string RequestedState { get { return string.IsNullOrEmpty(Page.Request.QueryString["State"]) ? "TN" : Page.Request.QueryString["State"]; } } protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); ColumnList.Visible = false; } private SPFieldCollection Fields { get { if (this.PickerDialog == null || this.PickerDialog.EditorControl == null) return null; else return ((SearchTextBoxPicker)this.PickerDialog.EditorControl).Fields; } } private List<string> ShowColumns { get { if (this.PickerDialog == null || this.PickerDialog.EditorControl == null) return null; else return ((SearchTextBoxPicker)this.PickerDialog.EditorControl).ShowColumns; } } private DataTable CreateTable() { DataColumn column; var table = new DataTable(); column = new DataColumn(); column.DataType = typeof(string); column.ColumnName = "Id"; // column.Caption = "ИД"; table.Columns.Add(column); if (Fields == null) return table; column = new DataColumn(); column.DataType = typeof(string); column.ColumnName ="Title"; // column.Caption = Fields.GetFieldByInternalName("Title").Title; table.Columns.Add(column); foreach (string name in ShowColumns) { column = new DataColumn(); column.DataType = typeof(string); column.ColumnName = name; // column.Caption = Fields.GetFieldByInternalName(name).Title; table.Columns.Add(column); } return table; } public override PickerEntity GetEntity(DataRow dr) { if (dr == null) return null; var entity = new PickerEntity(); entity.Key = dr["Id"].ToString(); entity.DisplayText = dr["Title"].ToString(); entity.EntityData.Clear(); if (ShowColumns != null) { foreach (string name in ShowColumns) { entity.EntityData.Add(name, dr[name]); } } return entity; } protected override int IssueQuery(string search, string groupName, int pageIndex, int pageSize) { search = (search!=null) ? search.Trim() : null; if (string.IsNullOrEmpty(search)) { PickerDialog.ErrorMessage = "Строка поиска пуста"; return 0; } SPList list = ((SearchTextBoxPicker) this.PickerDialog.EditorControl).List; if (list == null) { PickerDialog.ErrorMessage = "Список поиска не задан"; return 0; } SPQuery qry = new SPQuery(); qry.Query = "<Where>" + "<Contains>" + "<FieldRef Name=\"Title\"/>" + "<Value Type=\"Text\">" + search + "</value>" + "</Eq>" + "</Where>" + "<OrderBy>FieldRef Name=\"Title\"/></OrderBy>"; SPListItemCollection items = list.GetItems(qry); if (items.Count == 0) { PickerDialog.ErrorMessage = "Ничего не найдено"; return 0; } var table = CreateTable(); foreach (SPListItem item in items) { var row = table.NewRow(); row["Id"] = item.ID; row["Title"] = item.DisplayName; foreach (string name in ShowColumns) { row[name] = item[name].ToString(); } table.Rows.Add(row); } PickerDialog.Results = table; PickerDialog.ResultControl.PageSize = table.Rows.Count; var rc = (TableResultControl)PickerDialog.ResultControl; if (rc != null) { int n = ShowColumns.Count*40+20+80; rc.ColumnNames.Add("Id"); rc.ColumnNames.Add("Title"); rc.ColumnDisplayNames.Add("ИД"); rc.ColumnDisplayNames.Add(Fields.GetFieldByInternalName("Title").Title); int pp = 100; int cp = (int)20*100/n; pp -= cp; n -= 20; rc.ColumnWidths.Add(cp.ToString()+"%"); cp = (int)80 * 100 / n; pp -= cp; n -= 80; rc.ColumnWidths.Add(cp.ToString() + "%"); foreach (string name in ShowColumns) { rc.ColumnNames.Add(name); rc.ColumnDisplayNames.Add(Fields.GetFieldByInternalName(name).Title); cp = (int)40 * 100 / n; pp -= cp; n -= 40; rc.ColumnWidths.Add(cp.ToString() + "%"); } } return table.Rows.Count; } } public class SearchTextBoxPicker : EntityEditorWithPicker { public SPList List = null; private List<string> _columns = new List<string>(); public List<string> ShowColumns { set { _columns = value; } get { return _columns;} } public SPFieldCollection Fields { get { return List.Fields; } } private Guid SiteId { get; set; } private Guid WebId { get; set; } private string WebUrl { get; set; } protected override void OnInit(EventArgs e) { // breakpoint base.OnInit(e); PickerDialogType = typeof(SearchTreePickerDialog); MultiSelect = false; // this.PickerDialog = new SearchTreePickerDialog(new TextBoxSearcher(), new TableResultControl(), new SearchTextBoxPicker()); var ctx = SPContext.Current; SiteId = ctx.Site.ID; WebId = ctx.Web.ID; WebUrl = ctx.Web.Url; Height = new Unit(100, UnitType.Percentage); CssClass = "ms-usereditor"; } public override PickerEntity ValidateEntity(PickerEntity needsValidation) { if (needsValidation == null) return null; if (needsValidation.IsResolved) return needsValidation; return needsValidation; } protected override PickerEntity[] ResolveErrorBySearch(string unresolvedText) { //return base.ResolveErrorBySearch(unresolvedText); var res = new PickerEntity[] { }; return res; } public new void UpdateEntities(ArrayList list) { // breakpoint base.UpdateEntities(list); } }

    еще ссылки по теме: Picker

    и еще вот

    судя по всем ссылкам, должен срабатывать brakpoint в констркуторе: public SearchTreePickerDialog()
    но сюда ни разу не было попадания.
    Может кто-то достаточно хорошо разобрался с PickerDialog'ом чтобы подсказать мне, что не так?

    12 ноября 2012 г. 5:16