Как использовать данные из соединения IWebPartRow при нажатии кнопки.Провайдер всегда нулевой - PullRequest
0 голосов
/ 16 декабря 2011

Я не уверен, как объяснить мою проблему Я пытаюсь реализовать веб-часть с подключением к веб-частям в виде списка. Для подключения я использую интерфейс IWebPartRow. Вот чего я хочу добиться: В веб-части просмотра списка я могу выбрать пункт. В моем WebPart отображаются детали из провайдера соединений и кнопка. Когда эта кнопка нажата, я хочу сделать что-то, используя данные, поступающие от провайдера соединения.

Здесь код веб-части:

using System;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using System.Data;
using System.Text;

namespace ConnectedFilesWebPart.TestWebPart
{
    [ToolboxItemAttribute(false)]
    public class TestWebPart : Microsoft.SharePoint.WebPartPages.WebPart
    {

        public DataRowView DataRow
        {
            get; 
            set;
        }

        public IWebPartRow Provider
        {
            get;
            set;
        }
        private readonly StringBuilder _sb = new StringBuilder();

        protected override void CreateChildControls()
        {
            //TestWebPartUserControl control = (TestWebPartUserControl)Page.LoadControl(_ascxPath);
            Button myButton = new Button();
            myButton.Text = "myButton";
            myButton.Click += new EventHandler(myButton_Click);
            Controls.Add(myButton);
        }

        protected void myButton_Click(object sender, EventArgs e)
        {

            if (DataRow != null)
            {
                int lookupId = Int32.Parse(DataRow["ID"].ToString());
                string title = DataRow["Title"].ToString();
            }
        }

        private void GetRowData(object rowData)
        {
            try
            {
                DataRow = (DataRowView)rowData;
            }
            catch
            {
                DataRow = null;
            }
        }

        protected override void OnPreRender(EventArgs e)
        {
            if (Provider != null)
                Provider.GetRowData(new RowCallback(GetRowData));
        }

        [ConnectionConsumer("Row", AllowsMultipleConnections = true)]
        public void ReceiveProvider(IWebPartRow p)
        {
            Provider = p;
        }

        protected override void RenderContents(HtmlTextWriter writer)
        {
            base.RenderContents(writer);
            if (DataRow != null)
            {
                DataRow providerRow = DataRow.Row;
                foreach (DataColumn column in providerRow.Table.Columns)
                    _sb.AppendFormat("- data column: {0} = {1}\n", column.ColumnName ?? "n/a", providerRow[column]);
                _sb.Append("\n");
                writer.Write(_sb.ToString().Replace("\n", "<br>"));
            }
        }
    }
}

Когда веб-часть загружена, соединение работает нормально. Но по какой-то причине, когда я нажимаю кнопку в myButton_Click, объект DataRow всегда равен нулю. Мне кажется, что веб-часть загружается снова, но на этот раз провайдер не вызывается. Что я делаю не так?

1 Ответ

0 голосов
/ 21 декабря 2011

Я пытаюсь сделать то же самое. Я нашел учебник на MSDN, который выглядит так, как будто он соединит точки (для вас и для меня!). Надеюсь, это поможет.

Редактировать: еще лучший ответ можно найти здесь . Это делает что-то похожее на то, что вы пытаетесь сделать, и это работает! Также есть загружаемый код!

...