MOSS 2007, C #, веб-часть - получение журнала с помощью LinkButtons - PullRequest
0 голосов
/ 11 августа 2009

Технология: SharePoint / MOSS 2007 - IDE: Visual Studio 2008 - Язык: C #

Я создал веб-часть SharePoint / MOSS 2007, которая отображает список файлов журнала. Файлы журнала отображаются на экране как LinkButtons. LinkButtons находятся в DataTable, который установлен как источник данных SPGridView и привязан к нему. Затем этот объект SPGridView добавляется к элементам управления в переопределенном методе «CreateChildControls ()» веб-части.

Я использую следующий вспомогательный класс DownloadAssistant для отображения указанного файла. Его метод «DownloadFile» вызывается из события «.Click» каждого LinkButton.

using System;
using System.Web;

/// <summary>
/// A class that helps to build download buttons/links on the fly
/// </summary>
static public class DownloadAssistant
{
    static public void DownloadFile(string filePath)
    {
        try
        {
            HttpContext.Current.Response.Clear();
            HttpContext.Current.Response.AddHeader("Content-Disposition", string.Concat("attachment; filename=", filePath));
            HttpContext.Current.Response.ContentType = "application/octet-stream";
            HttpContext.Current.Response.WriteFile(filePath);
            HttpContext.Current.Response.Flush();
            HttpContext.Current.Response.End();
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}  

После того, как одна кнопка LinkButton нажата на экране, я получаю всплывающее окно загрузки, как ожидается, и могу пойти дальше и открыть первый файл журнала. Однако после того, как этот первый файл журнала открыт, то есть после того, как сработало первое событие щелчка LinkButton, я не могу вызвать любое другое событие .Click - это то, что мне нужно отправить обратно на экран. Когда я нажимаю на любую другую кнопку LinkButtons, ничего не происходит?

Код веб-части:

namespace LogRetrievalWebPart
{
    [Guid("fd243ec2-83e3-4bad-af5e-c5c16acbc6dd")]
    public class LogRetrievalWebPart : System.Web.UI.WebControls.WebParts.WebPart
    {
        // Member variables prefixed with "m_"
        private Label m_InfoLbl;
        private SPGridView m_GridView;
        private DataTable m_LogFileDataTable;
        private DropDownList m_DirectoryDropDown;


        private const String DROPDOWN_OPTION_DEFAULT = "---";
        private const String DROPDOWN_OPTION_TRACE_LOGS = "Trace Logs";
        private const String DROPDOWN_OPTION_BATCH_LOGS = "Batch Logs";
        private const String DROPDOWN_OPTION_OTHER_LOGS = "Other Logs";

        public LogRetrievalWebPart()
        {
            this.ExportMode = WebPartExportMode.All;
        }

        protected override void CreateChildControls()
        { 
            EnsureChildControls();

            base.CreateChildControls();

            m_InfoLbl = new Label();
            Label dropDownLbl = new Label();
            dropDownLbl.Text = " Please select a directory:  ";
            this.Controls.Add(dropDownLbl);


            m_DirectoryDropDown = new DropDownList();
            m_DirectoryDropDown.Items.Add(DROPDOWN_OPTION_DEFAULT);
            m_DirectoryDropDown.Items.Add(DROPDOWN_OPTION_TRACE_LOGS);
            m_DirectoryDropDown.Items.Add(DROPDOWN_OPTION_BATCH_LOGS);
            m_DirectoryDropDown.Items.Add(DROPDOWN_OPTION_OTHER_LOGS);
            m_DirectoryDropDown.TextChanged += new EventHandler(directoryDropdown_TextChanged);
            m_DirectoryDropDown.AutoPostBack = true;

            m_LogFileDataTable = new DataTable("LogFiles");
            AddColums();

            m_GridView = new SPGridView();
            m_GridView.AutoGenerateColumns = false;

            BoundField idField = new BoundField();
            idField.DataField = "ID";
            idField.HeaderText = "ID";
            m_GridView.Columns.Add(idField);

            TemplateField colName = new TemplateField();
            colName.HeaderText = "Log File Name";
            colName.SortExpression = "LogFileName";
            colName.ItemTemplate = new LinkTemplate("LogFileName", "Path");
            m_GridView.Columns.Add(colName);

            this.Controls.Add(m_DirectoryDropDown);
            this.Controls.Add(m_InfoLbl);
            this.Controls.Add(m_GridView);

            this.Load += new EventHandler(LogRetrievalWebPart_Load);
            this.PreRender += new EventHandler(LogRetrievalWebPart_PreRender);
        }

    void LogRetrievalWebPart_Load(object sender, EventArgs e)
    {
        EnsureChildControls();
    }

    protected void directoryDropdown_TextChanged(object sender, EventArgs e)
    {
        ViewState["LogRetrieval"] = null;
        String selectedDirectoryName = m_DirectoryDropDown.SelectedItem.Text;

        if (DROPDOWN_OPTION_TRACE_LOGS.Equals(selectedDirectoryName))
        {
            m_InfoLbl.Text = " *** TRACE Logs: *** ";
            GetLogFiles("LogFiles/TraceLogs");
        }
        else if (DROPDOWN_OPTION_BATCH_LOGS.Equals(selectedDirectoryName))
        {
            m_InfoLbl.Text = " *** BATCH Logs: *** ";
            GetLogFiles("PortalExecutables/Logs");
        }
        else if (DROPDOWN_OPTION_OTHER_LOGS.Equals(selectedDirectoryName))
        {
            m_InfoLbl.Text = " *** OTHER Logs: *** ";
            GetLogFiles("PortalExecutables/GMExecutables");
        }
        else
        {
            m_InfoLbl.Text = " *** No Logs to display for this selection!!! *** ";
        }

        ViewState["LogRetrieval"] = m_LogFileDataTable;
        m_GridView.DataSource = m_LogFileDataTable;
        m_GridView.DataBind();
    }

    private void GetLogFiles(string aSelectedDirectory)
    {
        string directoryPath = HttpContext.Current.Server.MapPath(ResolveUrl("/LogFiles/" + aSelectedDirectory));

        DirectoryInfo directory = new DirectoryInfo(directoryPath);
        FileInfo[] files = directory.GetFiles();

        int count = 1;
        foreach (FileInfo fileInfo in files)
        {
            string fullFileName = fileInfo.FullName;
            string fileName = fileInfo.ToString();

            AddRow(count, fileName, fullFileName);
            count++;
        }
    }

    private void AddRow(int id, string logFileName, string fullFileName)
    {
        DataRow newRow = m_LogFileDataTable.Rows.Add();
        newRow["ID"] = id;
        newRow["LogFileName"] = logFileName;
        newRow["Path"] = fullFileName;
    }

    private void AddColums()
    {
        DataColumn idCol = m_LogFileDataTable.Columns.Add("ID", typeof(Int32));
        idCol.Unique = true;

        m_LogFileDataTable.Columns.Add("LogFileName", typeof(String));
        m_LogFileDataTable.Columns.Add("Path", typeof(String));
    }

    public void LogRetrievalWebPart_PreRender(object sender, EventArgs e)
    {
        if (this.Page.IsPostBack)
        {
            if (ViewState["LogRetrieval"] != null)
            {
                m_LogFileDataTable = (DataTable)ViewState["LogRetrieval"];
                m_GridView.DataSource = m_LogFileDataTable;
                m_GridView.DataBind();
            }
        }
    }

    public class LinkTemplate : ITemplate
    {
        string logFileName;
        string logFilePath;

        public LinkTemplate(string fieldName, string path)
        {
            logFileName = fieldName;
            logFilePath = path;
        }

        public void InstantiateIn(Control container)
        {
            LinkButton link = new LinkButton();
            container.Controls.Add(link);

            link.DataBinding += new EventHandler(link_DataBinding);
            link.Click += new EventHandler(link_Click);
        }

        private void link_DataBinding(Object sender, EventArgs e)
        {
            LinkButton link = (LinkButton)sender;
            DataRowView dataRow = (DataRowView)((SPGridViewRow)link.NamingContainer).DataItem;

            link.Text = dataRow[logFileName].ToString();
            link.CommandArgument = dataRow[logFilePath].ToString();
        }

        private void link_Click(object sender, EventArgs e)
        {
            LinkButton link = (LinkButton)sender;
            DownloadAssistant.DownloadFile(link.CommandArgument);
        }
    }
}
}

1 Ответ

0 голосов
/ 25 августа 2009

Я нашел решение. Я должен был:

  1. Установите событие нажатия кнопки на стороне клиента на: "exportRequested = true;"
  2. Зарегистрируйте некоторые JavaScript: для более подробной информации, обратитесь к:

http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/55136e4e-e1f7-4a79-9b75-be09cd5594c2

...