Tagged: WinCE

WinCe 6.0 DataGrid 绑定List数据源

最近在项目中,使用了老的掉牙的Windows CE作为开发基础。在实际项目使用中,我从后端通过RestFul接口获取数据,然后将数据通过JSON转为了实体类,然后直接绑定到了DataGird中。

问题接着就来了,在DataGrid中使用List<T>作为数据源的时候,我要自定义DataGridTableStyle的时候,需要设置MappingName,但各种资料翻完也没有找到如何设置这个值的信息。

通过Debug,原来设置List为数据源需要将MappingName设置为 List`1

经过反复测试,发现直接设置为 typeof(List).Name即可

参考代码

// 实体对应类
public class MTPDAOnTheShelfTaskQueryResp
{
    public ControlInfo ControlInfo { get; set; }
    public List<ITEM> ITEM { get; set; }
    public RETURN RETURN { get; set; }
}
// 初始化界面设定
private void StockInQuery_Load(object sender, EventArgs e)
{
    dateTimePickerStart.Value = DateTime.Now;
    dateTimePickerEnd.Value = DateTime.Now;

    // 设定 Style
    ColumnStyle[] columnStyles = new ColumnStyle[]{
                new ColumnStyle("MBLNR","任务单号",100),
                new ColumnStyle("MAKTX", "日期", 70),
                new ColumnStyle("MATNR", "创建人", 100)
            };
    CommonHandles.SetDataGridStyles(dataGrid, columnStyles, "List`1");
}

/// <summary>
/// 设置DataGird列样式
/// </summary>
/// <param name="dataGrid"></param>
/// <param name="styles"></param>
/// <param name="mappingName"></param>
public static void SetDataGridStyles(DataGrid dataGrid, ColumnStyle[] styles, string mappingName)
{
    dataGrid.TableStyles.Clear();

    DataGridTableStyle tableStyle = new DataGridTableStyle();
    tableStyle.MappingName = mappingName;
    foreach (ColumnStyle style in styles)
    {
        DataGridColumnStyle col = new DataGridTextBoxColumn();
        col.MappingName = style.MappingName;
        col.HeaderText = style.DisplayName;
        col.Width = style.Width;
        tableStyle.GridColumnStyles.Add(col);
    }

    dataGrid.TableStyles.Add(tableStyle);

    // 设置行头不可见
    dataGrid.RowHeadersVisible = false;
    //dataGrid.ColumnHeadersVisible = false;
}

// 数据绑定
if (!string.IsNullOrEmpty(result))
{
    StockInQueryRespnose respnose = JsonConvert.DeserializeObject<StockInQueryRespnose>(result);
    if (respnose.MT_PDA_On_The_Shelf_Task_Query_Resp.RETURN.MSGTYPE.Equals("E"))
    {
        MessageBox.Show(respnose.MT_PDA_On_The_Shelf_Task_Query_Resp.RETURN.MSGTXT, "警告", MessageBoxButtons.OK, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1);
        return;
    }
    else if (respnose.MT_PDA_On_The_Shelf_Task_Query_Resp.RETURN.MSGTYPE.Equals("S"))
    {
        dataGrid.DataSource = respnose.MT_PDA_On_The_Shelf_Task_Query_Resp.ITEM;
    }
}

WinCE 同步时间

最近项目中PDA的时间总是与业务数据时间不符,因此需要一个这样的功能。

首先确定使用WebService的Response信息作为时间的获取源头。

#region 修改系统日期
[DllImport("coredll.dll")]
private static extern bool SetLocalTime(ref SystemTime lpSystemTime);

public struct SystemTime
{
    public short wYear;
    public short wMonth;
    public short wDayOfWeek;
    public short wDay;
    public short wHour;
    public short wMinute;
    public short wSecond;
    public short wMilliseconds;
}

/// <summary>
/// 设置系统当前日期
/// </summary>
public static void SetTime()
{

    WebRequest request = null;
    WebResponse response = null;
    WebHeaderCollection headerCollection = null;

    string webserviceUrl = string.Format("http://{0}/axis/servlet/AxisServlet", DB.GetServerAddr());
    string datetime = string.Empty;
    CultureInfo cultureInfo = CultureInfo.CreateSpecificCulture("en-US");
    // Tue, 11 Sep 2018 09:46:58 GMT
    string format = "r";

    try
    {
        request = WebRequest.Create(webserviceUrl);
        request.Timeout = -1;
        request.Credentials = CredentialCache.DefaultCredentials;
        response = request.GetResponse();
        headerCollection = response.Headers;
        foreach (var item in headerCollection.AllKeys)
        {
            if (item.Equals("Date",StringComparison.CurrentCultureIgnoreCase))
            {
                datetime = headerCollection[item];
            }
        }

        SystemTime newTime = new SystemTime();
        DateTime dt = DateTime.ParseExact(datetime, format, cultureInfo).AddHours(8.00);

        newTime.wYear = Convert.ToInt16(dt.Year);
        newTime.wMonth = Convert.ToInt16(dt.Month);
        newTime.wDay = Convert.ToInt16(dt.Day);
        newTime.wDayOfWeek = Convert.ToInt16(dt.DayOfWeek);
        newTime.wHour = Convert.ToInt16(dt.Hour);
        newTime.wMinute = Convert.ToInt16(dt.Minute);
        newTime.wSecond = Convert.ToInt16(dt.Second);

        SetLocalTime(ref newTime);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        if (request != null)
        {
            request.Abort();
        }
        if (response != null)
        {
            response.Close();
        }
        if (headerCollection != null)
        {
            headerCollection.Clear();
        }
    }
}
#endregion

VS2008编译WinCE程序过慢解决办法

VS2008环境下采用C#、.NET Compact Framework开发WinCE、Windows Mobile程序时,编译项目非常慢,有时候需要几分钟甚至十几分钟,如果出现这种情况,除了排除机器配置问题外,你可以修改VS的配置文件,以屏蔽掉编译中不需要的任务,这个修改可以让你的编译速度大大提高,有可能你的编译时间只需要几秒钟就搞定了啊。

1、找到以下文件

%windir%\Microsoft.NET\Framework\v3.5\Microsoft.CompactFramework.Common.targets

2、用记事本打开该文件,找到以下节点,在target树节点上增加 Condition="'$(SkipPlatformVerification)' == 'true'" 修改后的内容如下。

<Target Name="PlatformVerificationTask" Condition="'$(SkipPlatformVerification)' == 'true'" >
  <PlatformVerificationTask
    PlatformFamilyName="$(PlatformFamilyName)"
    PlatformID="$(PlatformID)"
    SourceAssembly="@(IntermediateAssembly)"
    ReferencePath="@(ReferencePath)"
    TreatWarningsAsErrors="$(TreatWarningsAsErrors)"
    PlatformVersion="$(TargetFrameworkVersion)"/>
</Target>

具体可以参考:https://blogs.msdn.microsoft.com/vsdteam/2006/09/15/platform-verification-task/

Archives