Pergunta

Estou a ter alguma dificuldade em transmitir um objeto de classe entre duas web parts (Fornecedor e Consumidor).Basicamente, sempre que eu tento construir o meu projeto eu recebo este erro:

'ConnectableWebParts.LinkButtonProvider.LinkButtonProvider' não implementa a interface membro 'ConnectableWebParts.ISalObject.SalItem'

Eu consegui isso usando objetos primitivos, tais como cadeias de caracteres, mas por algum motivo ele tem problemas com a transmissão de uma classe que tem+ de 3 variáveis de seqüência de caracteres.

Eu olhei alguns dos meus exemplos anteriores para ver se há algo que eu estou em falta, mas tudo parece correto.Então, eu suponho que há algumas única diferença entre a transferência de objetos primitivos e transferência de objetos da classe.

Poderia realmente usar um segundo par de olhos, ou se alguém tiver feito isso antes, isso seria ótimo.Obrigado pelo seu tempo.

Solução abaixo.

Interface

namespace ConnectableWebParts
{
    public interface ISalObject
    {
        SalObject SalItem { get; set; }
    }
}

Classe

namespace ConnectableWebParts
{
    public class SalObject
    {
        private string name;
        private string description;
        private string code;

        public string Name { get { return name; } set { name = value; } }
        public string Description { get { return description; } set { description = value; } }
        public string Code { get { return code; } set { code = value; } }

        public SalObject() {
            name = "";
            description = "";
            code = "000000";
        }

        public void storeDate()
        {
            Name = "John Doe";
            Description = "Good Omen";
            Code = "111111";
        }
    }
}

Fornecedor

namespace ConnectableWebParts.LinkButtonProvider
{
    [ToolboxItemAttribute(false)]
    public partial class LinkButtonProvider : WebPart, ISalObject
    {
        private SalObject _salvage = new SalObject();

        [Personalizable()]
        public SalObject Salvage {
            get { return _salvage; }
            set { _salvage = value; }
        }

        [ConnectionProvider("Provider for SalObject From LinkButton", "SalObjectProvider")]
        public ISalObject SalObjectProvider()
        {
            return this;
        }

        public LinkButtonProvider()
        {
        }

        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            InitializeControl();
        }

        protected void Page_Load(object sender, EventArgs e)
        {
        }

        protected void LinkButton1_Click(object sender, EventArgs e)
        {
            Salvage = new SalObject();
        }
    }
}

Consumidor

namespace ConnectableWebParts.LinkButtonConsumer
{
    [ToolboxItemAttribute(false)]
    public partial class LinkButtonConsumer : WebPart
    {
        private ISalObject _myProvider;

        [ConnectionConsumer("SalObject Consumer", "SalObjectConsumer")]
        public void SalvageConsumer(ISalObject Provider)
        {
            _myProvider = Provider;
        }

        public LinkButtonConsumer()
        {
        }

        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            InitializeControl();
        }

        protected void Page_Load(object sender, EventArgs e)
        {
        }

        protected override void OnPreRender(EventArgs e)
        {
            EnsureChildControls();
            if (_myProvider != null)
            {
                NameCell.Text = _myProvider.SalItem.Name;
                DescCell.Text = _myProvider.SalItem.Description;
                CodeCell.Text = _myProvider.SalItem.Code;
            }
        }
    }
}

EDITAR: Haha hah!

Acontece que quando se lida com objetos de classe eu nem preciso usar uma Interface.
Parece uma interface é necessária quando se lida com objetos primitivos (string, int, long, etc.) ou OOTB Web Parts.

Então eu removi a interface do projeto, substituído todas as minhas chamadas para o nome da classe em si, e definir o meu Provedor de apenas herdar da WebPart.

Agora ele funciona exatamente como eu queria.Espero que outras pessoas possam usar estas informações.enter image description here

Foi útil?

Solução 2

Haha hah!

Acontece que quando se lida com objetos de classe eu nem preciso usar uma Interface.
Parece uma interface é necessária quando se lida com objetos primitivos (string, int, long, etc.) ou OOTB Web Parts.

Então eu removi a interface do projeto, substituído todas as minhas chamadas para o nome da classe em si, e definir o meu Provedor de apenas herdar da WebPart.

Agora ele funciona exatamente como eu queria.Espero que outras pessoas possam usar estas informações.enter image description here

Outras dicas

Eu poderia estar totalmente fora sobre isso, mas eu acho que você teria para certificar-se de seu objeto (classe) que dá suporte a serialização.

Básica de serialização, exigiria marcando a classe com o atributo [Serializable], mas talvez você precise de alguma coisa mais avançada.Veja aqui para mais detalhes: http://msdn.microsoft.com/en-us/library/4abbf6k0%28v=vs.90%29.aspx

Em qualquer caso, usando básica de serialização, seria rápida o suficiente para tentar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top