LIGHTSWITCH学习一阶段,通过实际项目进行练手,期间也遇到了不少问题,通过查询MSDN,访问LIGHTSwitch开发团队BLOG,也积累了一点经验。特此记录,以留后人学习时参考。
一开始时,LightSwitch环境很不正常,VS的工具箱也找不到,同时无法进行代码编辑。此问题经查,初步可以判断是安装了Async-CTP1所致(可能与ls处理有冲突)。但直接卸载该工具却无效,只得全部重装系统。
1、OOB模式下禁用System.Windows.Browser.HtmlPage.Window.Navigate方法,如何打开一个新的窗口。
if (AutomationFactory.IsAvailable)
{
dynamic shell = AutomationFactory.CreateObject("Shell.Application");
shell.ShellExecute("http://localhost");
}
else if (!System.Windows.Application.Current.IsRunningOutOfBrowser)
{
System.Windows.Browser.HtmlPage.Window.Navigate(new Uri("http://localhost"), "_blank");
}
2、Lightswitch中如何取得当前URI,同上OOB模式
System.Windows.Application.Current.Host.Source 而非默认的Application.Current.
3、跨进程调用,如显示自定义的窗体:
Dispatchers.Main.BeginInvoke(() =>
{
SelectFileWindow selectFileWindow = new SelectFileWindow();
selectFileWindow.Closed += new EventHandler(selectFileWindow_Closed);
selectFileWindow.Show();
});
4、IVisualCollection<T>.AddNew() 不应从 UI 线程中进行调用,此问题出在一个异步调用完成(如上传文件成功后),需对集合进行操作时。
ProjectDocData.Details.Dispatcher.BeginInvoke(() =>
{
var data = ProjectDocData.AddNew();
data.DisplayName = e.ItemInfo.Name;
data.FilePath = "fa";
data.ProjectDocItem = this.ProjectDoc.SelectedItem;
// });
});
ProjectDocData 为T
5、如何设置默认值:
1. 在数据源表的Created事件中处理
public partial class WorkPlanHead
{
partial void PlanYearMonth_Compute(ref string result)
{
// 将结果设置为所需的字段值
result = string.Format("{0}年{1}月", this.PlanYear, this.PlanMonth);
}
partial void WorkPlanHead_Created()
{
if (DateTime.Now.Month == 12)
{
this.PlanYear = DateTime.Now.Year + 1;
this.PlanMonth = 1;
}
else
{
this.PlanYear = DateTime.Now.Year;
this.PlanMonth = DateTime.Now.Month + 1;
}
this.FillDate = DateTime.Now;
}
}
2. 在SCREEN事件中处理
public partial class WorkPlanHeadsListDetail
{
partial void WorkPlanHeadsListDetail_Created()
{
// 在此编写您的代码。
// PlanYear1为SCREEN中控件的名字;
this.FindControl("PlanYear1").ControlAvailable += new EventHandler<ControlAvailableEventArgs>(WorkPlanHeadsListDetail_ControlAvailable);
}
void WorkPlanHeadsListDetail_ControlAvailable(object sender, ControlAvailableEventArgs e)
{
var t = e.Control as TextBox;
}
}
6、It is not valid to create a Data Workspace on the current thread because it was not created by the LightSwitch runtime
这是在发布模式(布署到应用现场或Release)模式下,LS不支持自定义设置窗口。该功能仅提供给开发人员调试时使用,需VS环境运行支持。
7、如何处理数据的权限,即某些人可以访问全部数据,而部分人只能访问自己的数据
使用数据实体的XX_All_PreprocessQuery方法进行数据的过滤,此过程在服务器端执行。
partial void WorkPlanDetails_All_PreprocessQuery(ref IQueryable<WorkPlanDetail> query)
{
if (!Application.User.HasPermission(Permissions.CreateMonthPlanHead)) //如果没有创建计划主体的权限,仅显示自己相关的计划内容
{
query = query.Where(p => p.Filler == Application.User.FullName);
}
}
注:在SCREEN上,可通过给数据源加上过滤条件(参数)来判断,但SCREEN成功执行只显示一部分数据,导出数据时却导出全部的数据。因此,估计SCREEN只是在客户端执行数据过滤功能。