以下に示すように、すべてのCrystalレポートを表示するページがあります。
これらのレポートには、 https://myserver.bla.blaなどを指す(悲しいことにハードコーディングされた)URL式が含まれています。
どういうわけか、プログラムでURLのインスタンスを探し、それらを別のインスタンスに変更したいと思います(これらのレポートは数百あり、現在、すべてのリンクを変更するのに十分な時間がありません)。
FieldObjectsを探していましたが、書式設定式を変更する方法がわからないようです。reportdocument.fieldformulasを見ると、URLの書式設定式がありません。
パブリック部分クラスレポート:System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e)
{
iLogger logger = LoggingFactory.CreateLogger();
ReportDocument rd = new ReportDocument();
string fileName = Request.QueryString["reportfile"];
if(!Regex.IsMatch(fileName,@"^[ 0-9a-zA-Z-_\\]+.rpt$"))
{
ArgumentException aex = new ArgumentException("Invalid file/path specified.");
logger.LogError(ActionTypes.Administration, HttpContext.Current.User.Identity.Name,
"Passed invalid file path to report viewer: " + fileName, aex);
throw aex;
}
if(Path.IsPathRooted(fileName))
{
ArgumentException aex = new ArgumentException("Absolute path passed to report viewer.");
logger.LogError(ActionTypes.Administration, HttpContext.Current.User.Identity.Name,
"Passed invalid file path to report viewer: " + fileName, aex);
throw aex;
}
string rootPath = Server.MapPath("~/Reports/");
string path = Path.Combine(rootPath, fileName);
if (File.Exists(path))
{
rd.Load(path);
}
//get all keys starting with Prompt
var prompts = Request.QueryString.AllKeys.Where(q => q.StartsWith("Prompt"));
foreach (string promptKey in prompts)
{
//try to convert the rest of the string to an int
//yes, this should probably not just be a replace here...
string withoutPrompt = promptKey.Replace("Prompt", "");
int promptVal;
if (int.TryParse(withoutPrompt, out promptVal))
{
rd.SetParameterValue(promptVal, Request.QueryString[promptKey]);
}
//rd.SetParameterValue(promptKey, Request.QueryString[promptKey]);
CrystalReportViewer1.ReportSource = rd;
}
}