LightSwitch学习阶段疑难问答

 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只是在客户端执行数据过滤功能。


 

你可能感兴趣的:(LightSwitch学习阶段疑难问答)