テクノロジー:SharePointの/ MOSS 2007 - IDE:Visual Studioの2008 - 言語:C#MOSS 2007、C#の、Webパーツ - ログRetrievel LinkButtonsを使用して
私はSharePointの/ MOSS 2007のWebパーツを作成しましたログファイルのリストを表示します。 ログファイルは、LinkButtonとしてレンダリングされます。 LinkButtonは、SPGridViewのデータソースとして設定されバインドされたDataTable内にあります。 このSPGridViewオブジェクトは、Webパーツのオーバーライドされた "CreateChildControls()"メソッド内の 'Controls'に追加されます。
私は以下の "DownloadAssistant"ヘルパークラスを利用して、指定されたファイルを表示しています。 "DownloadFile"メソッドは各LinkButtonの '.Click'イベントから呼び出されます。
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;
}
}
}
1つのLinkButtonをクリックすると、期待どおりにダウンロードポップアップウィンドウが表示され、最初のログファイルを開くことができます。ただし、この最初のログファイルを開いた後、つまり最初のLinkButtonのクリックイベントが発生した後、他の.Clickイベントをトリガーすることはできません。画面にポストバックする必要があります。他のLinkButtonをクリックしても何も起こりません。
Webパーツコード:
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);
}
}
}
}
あなたはクリックハンドラ内でブレークポイントを追加し、それは間違いなくはい二度目 –
にヒットされていないことを確認、私は...それは間違いなく2回目に当たってはいない。 –
あなたは前後のソースを見て、diffをやってみましたか? – TheZenker