ActiveReports 专业版提供无额外版权费用的、可定制的Windows Forms最终用户报表设计器控件。专业版用户可以把这个控件包含在应用程序中,使得最终用户可以创建和修改报表。同时还可以把工具箱、报表资源管理器和Visual Studio属性窗口(Property Grid)也包含到应用程序中,使最终用户可以具有完备的报表定制能力。ActiveReports 安装程序包含了一个这方面的例子,用户可以以此为起点进行开发。本文将介绍如何在工具栏中添加“注释”和“取消注释”功能。
首先,在工具栏中添加“注释”和“取消注释”两个按钮,对应代码如下:
ToolStrip EditMenuStrip = reportdesigner.CreateToolStrips(DesignerToolStrips.Edit)[0];
btnCom = new ToolStripButton("Comment", Image.FromFile(@"../../Images/Comment.jpg"));
btnCom.Text = "";
btnCom.ToolTipText = "注释";
btnUnCom = new ToolStripButton("UnComment", Image.FromFile(@"../../Images/Uncomment.jpg"));
btnUnCom.Text = "";
btnUnCom.ToolTipText = "取消注释";
btnCom.Click += new EventHandler(btnCom_Click);
btnUnCom.Click += new EventHandler(btnUnCom_Click);
EditMenuStrip.Items.Add(btnCom);
EditMenuStrip.Items.Add(btnUnCom);
btnCom.Enabled = false;
btnUnCom.Enabled = false;
AppendToolStrips(1, new ToolStrip[] { EditMenuStrip });
然后在按钮对应的单击事件中添加以下代码:
void btnCom_Click(object sender, EventArgs e)
{
object obj = reportdesigner.Controls[0].Controls[1].Controls[0].Controls[4];
string[] strings = (String[])(obj.GetType().GetProperty("Strings").GetValue(obj, null));
object selectionScript = (object)obj.GetType().GetProperty("Selection").GetValue(obj, null);
int selectionStart = Convert.ToInt32(selectionScript.GetType().GetProperty("SelectionStart").GetValue(selectionScript, null));
int selectionLength = Convert.ToInt32(selectionScript.GetType().GetProperty("SelectionLength").GetValue(selectionScript, null));
int selstartline = -1;
int totalchars = 0;
string commentstring = "";
if (((SectionReport)reportdesigner.Report).ScriptLanguage.ToLower().Contains("vb"))
{
commentstring = "'";
}
else
{
commentstring = "//";
}
if (selectionLength > 0)
{
for (int i = 0; i <= strings.Length - 1; i++)
{
totalchars = totalchars + strings[i].Length;
if (totalchars > selectionStart & selstartline == -1)
{
selstartline = i;
}
totalchars = totalchars + 2;
if (selstartline != -1)
{
if (!string.IsNullOrEmpty(strings[i].Trim().Replace(" ", "")))
{
strings[i] = strings[i].Insert(0, commentstring);
}
}
if (totalchars > selectionStart + selectionLength - 1)
{
break; // TODO: might not be correct. Was : Exit For
}
}
obj.GetType().GetProperty("Strings").SetValue(obj, strings, null);
}
}
void btnUnCom_Click(object sender, EventArgs e)
{
object obj = reportdesigner.Controls[0].Controls[1].Controls[0].Controls[4];
string[] strings = (String[])(obj.GetType().GetProperty("Strings").GetValue(obj, null));
object selectionScript = (object)obj.GetType().GetProperty("Selection").GetValue(obj, null);
int selectionStart = Convert.ToInt32(selectionScript.GetType().GetProperty("SelectionStart").GetValue(selectionScript, null));
int selectionLength = Convert.ToInt32(selectionScript.GetType().GetProperty("SelectionLength").GetValue(selectionScript, null));
int selstartline = -1;
int totalchars = 0;
string commentstring = "";
if (((SectionReport)reportdesigner.Report).ScriptLanguage.ToLower().Contains("vb"))
{
commentstring = "'";
}
else
{
commentstring = "//";
}
if (selectionLength > 0)
{
for (int i = 0; i <= strings.Length - 1; i++)
{
totalchars = totalchars + strings[i].Length;
if (totalchars > selectionStart & selstartline == -1)
{
selstartline = i;
}
totalchars = totalchars + 2;
if (selstartline != -1)
{
if (((SectionReport)reportdesigner.Report).ScriptLanguage.ToLower().Contains("vb"))
{
if (strings[i][0].ToString() == "'")
{
strings[i] = strings[i].Remove(0, 1);
}
}
else
{
if (strings[i].IndexOf("//") == 0)
{
strings[i] = strings[i].Remove(0, 2);
}
else
{
if (strings[i].IndexOf("/") == 0)
{
strings[i] = strings[i].Remove(0, 1);
}
}
}
}
if (totalchars > selectionStart + selectionLength - 1)
{
break; // TODO: might not be correct. Was : Exit For
}
}
obj.GetType().GetProperty("Strings").SetValue(obj, strings, null);
}
}
运行截图如下:
源码下载: