Как установить свойство DataSource в файле .aspx пользовательского элемента управления? - PullRequest
0 голосов
/ 12 июля 2011

У меня есть пользовательский элемент управления (не хочу создавать пользовательский элемент управления) в этом элементе управления у меня есть список.Теперь я хочу использовать свойство Datasource, которое можно использовать в качестве источника данных для этого списка.

<UC:CustomList ID="list" CustomDataSource="objectDataSource1" runat="server" />

В элементе управления:

 public object CustomDataSource
    {
        get
        {
            return this.checkComboBox.DataSourceID;
        }

        set
        {
            this.checkComboBox.DataSource = value;
        }            
    }

Это дает ошибку времени выполнения "Невозможно создать объект типа«System.Object» из строкового представления «objectDataSource1» для свойства «CustomDataSource». "

Ответы [ 3 ]

2 голосов
/ 12 июля 2011

Как указал Джастин, правильная реализация будет

 public object CustomDataSource
 {
        get
        {
            return this.checkComboBox.DataSource;
        }

        set
        {
            this.checkComboBox.DataSource = value;
        }            
 }

Imp: Также убедитесь, что где бы вы ни устанавливали это свойство, вы не присваиваете ToString фактического источника данных (что вы должны делать для более ранней версии работа).

EDIT: Из вашего комментария вам нужно свойство DataSourceID, т.е.

public string CustomDataSourceID
     {
            get
            {
                return this.checkComboBox.DataSourceID;
            }

            set
            {
                this.checkComboBox.DataSourceID = value;
            }            
     }

Теперь вы можете использовать это свойство в разметке для декларативного связывания идентификатора источника данных.

0 голосов
/ 12 июля 2011

После повторного изучения вашего вопроса, я думаю, я понимаю, что вы просите.

Поскольку вы используете идентификатор ObjectDataSource, вам нужно найти этот элемент управления и получить свойство SelectMethod.Затем вам нужно вызвать этот метод, чтобы получить данные, которые будут представлены.Это то, что вы на самом деле не хотите делать, потому что это приводит к гораздо большему количеству проблем, таких как невозможность установить свойство CustomDataSource во фронте кода, так как Page.Controls не заполняется на этом этапе, поэтому вы не можете найти ObjectDataSourceконтроль.Однако вы можете установить это свойство в коде в Page_Load.

Вот пример того, как вы можете это сделать:

Код для управления пользователями:

public partial class MyUserControl : System.Web.UI.UserControl
{
    private string customDataSource;
    public string CustomDataSource
    {
        get { return customDataSource; }
        set
        {
            customDataSource = value;
            var ctrl = (ObjectDataSource) this.Page.FindControlRecursive(customDataSource);
            if (ctrl == null) return;

            var m = this.Page.GetType().GetMethod(ctrl.SelectMethod);
            if (m == null) return;

            var data = m.Invoke(this.Page, BindingFlags.InvokeMethod | BindingFlags.Public, null, null, null);

            checkComboBox.DataSource = data;
            checkComboBox.DataBind();
        }
    }
}

Код для страницы с использованием Usercontrol:

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            myCtrl.CustomDataSource = "objectDataSource1";
    }

    public object GetData()
    {
        return new List<string> { "1", "2", "3" };
    }
}

Где-то на странице вы вставляете свой Usercontrol с чем-то вроде:

<uc:MyUserControl runat="server" id="myCtrl"></uc:MyUserControl>

И, конечно, ObjectDataSource:

<asp:ObjectDataSource runat="server" ID="objectDataSource1" SelectMethod="GetData"></asp:ObjectDataSource>

FindControlRecursive - это простой метод расширения:

public static class ExtensionMethods
{
    public static Control FindControlRecursive(this Control control, string id)
    {
        if (control == null) return null;
        if (control.ID == id) return control;

        foreach (Control c in control.Controls)
        {
            var found = FindControlRecursive(c, id);
            if (found != null) return found;
        }

        return null;
    }
}
0 голосов
/ 12 июля 2011

Измените свой код на

public object CustomDataSource //<<<Changed to object from string
{
    get
    {
        return this.checkComboBox.DataSourceID;
    }

    set
    {
        this.checkComboBox.DataSource = value;
    }            
}

в вашем коде также упомяните следующее.

<uc1:lstControl id="lstControl1" runat="server" enabled="true"  CustomDataSource="datasourceName"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...