調皮↙不搗蛋的博客——歡迎光臨

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

      最近在ArcEngine中写了一个唯一值专题图的程序,运行之后却发现了一个奇怪的问题。在IUniqueVlaueRender中添加的字段是一个double类型的字段,都设置好后发现,在Toccontrol中每一个值都添加进去了,但是在MapControl中对象却都没有显示。但是很奇怪的是,唯有一个对象的值是0的,能够正常显示,其他的处于0-1的值都无法显示。

      起初怀疑是不是ArcGIS中的Scale设置的只是显示小数点位数,实际上存储的还是超过了6位小数点,到处找也没找到相关的资料,遂放弃。然后回到arcMap中,尝试不同的工具。使用Identify工具,查看到某对象的值是0.256903,然后使用这个值去到Find工具里去找,竟然没找到。。

      观察了一下,Identify中显示的值是“.256903”,更换了一个值之后,再回到Find里找“.256903”,找到了。回到AE中,将IUniqueValueRender中SetValue时所有的值介于-1 - +1之间的小数的0都trim掉,一切就好了。

      到此,清楚了,原来是系统的零起始设置(控制面板,区域和语言,其他设置,零起始显示)的问题。像上文一样更改了之后,当然可以解决问题。但是假如某台电脑的设置是0起始显示设置为带零的呢?又得重新设置。所以此处需要获取系统中的是否显示起始零的设置,然后更改程序中的值。

      获得“零起始显示”需要调用系统API,方法如下:

        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern int GetLocaleInfoEx(String lpLocaleName, LCTYPE LCType, StringBuilder lpLCData, int cchData);
        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern int GetUserDefaultLocaleName(StringBuilder lpLocaleName, int cchLocaleName);
        public enum LCTYPE : uint
        {
            LOCALE_NOUSEROVERRIDE = 0x80000000,   // do not use user overrides
            LOCALE_RETURN_NUMBER = 0x20000000,   // return number instead of string
            // Modifier for genitive names
            LOCALE_RETURN_GENITIVE_NAMES = 0x10000000,   //Flag to return the Genitive forms of month names
            //
            //  The following LCTypes are mutually exclusive in that they may NOT
            //  be used in combination with each other.
            //
            //
            // These are the various forms of the name of the locale:
            //
            LOCALE_SLOCALIZEDDISPLAYNAME = 0x00000002,   // localized name of locale, eg "German (Germany)" in UI language
            LOCALE_SENGLISHDISPLAYNAME = 0x00000072,   // Display name (language + country usually) in English, eg "German (Germany)"
            LOCALE_SNATIVEDISPLAYNAME = 0x00000073,   // Display name in native locale language, eg "Deutsch (Deutschland)
            LOCALE_SLOCALIZEDLANGUAGENAME = 0x0000006f,   // Language Display Name for a language, eg "German" in UI language
            LOCALE_SENGLISHLANGUAGENAME = 0x00001001,   // English name of language, eg "German"
            LOCALE_SNATIVELANGUAGENAME = 0x00000004,   // native name of language, eg "Deutsch"
            LOCALE_SLOCALIZEDCOUNTRYNAME = 0x00000006,   // localized name of country, eg "Germany" in UI language
            LOCALE_SENGLISHCOUNTRYNAME = 0x00001002,   // English name of country, eg "Germany"
            LOCALE_SNATIVECOUNTRYNAME = 0x00000008,   // native name of country, eg "Deutschland"
            // Additional LCTYPEs
            LOCALE_SABBREVLANGNAME = 0x00000003,   // abbreviated language name
            LOCALE_ICOUNTRY = 0x00000005,   // country code
            LOCALE_SABBREVCTRYNAME = 0x00000007,   // abbreviated country name
            LOCALE_IGEOID = 0x0000005B,   // geographical location id
            LOCALE_IDEFAULTLANGUAGE = 0x00000009,   // default language id
            LOCALE_IDEFAULTCOUNTRY = 0x0000000A,   // default country code
            LOCALE_IDEFAULTCODEPAGE = 0x0000000B,   // default oem code page
            LOCALE_IDEFAULTANSICODEPAGE = 0x00001004,   // default ansi code page
            LOCALE_IDEFAULTMACCODEPAGE = 0x00001011,   // default mac code page
            LOCALE_SLIST = 0x0000000C,   // list item separator
            LOCALE_IMEASURE = 0x0000000D,   // 0 = metric, 1 = US
            LOCALE_SDECIMAL = 0x0000000E,   // decimal separator
            LOCALE_STHOUSAND = 0x0000000F,   // thousand separator
            LOCALE_SGROUPING = 0x00000010,   // digit grouping
            LOCALE_IDIGITS = 0x00000011,   // number of fractional digits
            LOCALE_ILZERO = 0x00000012,   // leading zeros for decimal
            LOCALE_INEGNUMBER = 0x00001010,   // negative number mode
            LOCALE_SNATIVEDIGITS = 0x00000013,   // native digits for 0-9
            LOCALE_SCURRENCY = 0x00000014,   // local monetary symbol
            LOCALE_SINTLSYMBOL = 0x00000015,   // uintl monetary symbol
            LOCALE_SMONDECIMALSEP = 0x00000016,   // monetary decimal separator
            LOCALE_SMONTHOUSANDSEP = 0x00000017,   // monetary thousand separator
            LOCALE_SMONGROUPING = 0x00000018,   // monetary grouping
            LOCALE_ICURRDIGITS = 0x00000019,   // # local monetary digits
            LOCALE_IINTLCURRDIGITS = 0x0000001A,   // # uintl monetary digits
            LOCALE_ICURRENCY = 0x0000001B,   // positive currency mode
            LOCALE_INEGCURR = 0x0000001C,   // negative currency mode
            LOCALE_SDATE = 0x0000001D,   // date separator (derived from LOCALE_SSHORTDATE, use that instead)
            LOCALE_STIME = 0x0000001E,   // time separator (derived from LOCALE_STIMEFORMAT, use that instead)
            LOCALE_SSHORTDATE = 0x0000001F,   // short date format string
            LOCALE_SLONGDATE = 0x00000020,   // long date format string
            LOCALE_STIMEFORMAT = 0x00001003,   // time format string
            LOCALE_IDATE = 0x00000021,   // short date format ordering (derived from LOCALE_SSHORTDATE, use that instead)
            LOCALE_ILDATE = 0x00000022,   // long date format ordering (derived from LOCALE_SLONGDATE, use that instead)
            LOCALE_ITIME = 0x00000023,   // time format specifier (derived from LOCALE_STIMEFORMAT, use that instead)
            LOCALE_ITIMEMARKPOSN = 0x00001005,   // time marker position (derived from LOCALE_STIMEFORMAT, use that instead)
            LOCALE_ICENTURY = 0x00000024,   // century format specifier (short date, LOCALE_SSHORTDATE is preferred)
            LOCALE_ITLZERO = 0x00000025,   // leading zeros in time field (derived from LOCALE_STIMEFORMAT, use that instead)
            LOCALE_IDAYLZERO = 0x00000026,   // leading zeros in day field (short date, LOCALE_SSHORTDATE is preferred)
            LOCALE_IMONLZERO = 0x00000027,   // leading zeros in month field (short date, LOCALE_SSHORTDATE is preferred)
            LOCALE_S1159 = 0x00000028,   // AM designator
            LOCALE_S2359 = 0x00000029,   // PM designator
            LOCALE_ICALENDARTYPE = 0x00001009,   // type of calendar specifier
            LOCALE_IOPTIONALCALENDAR = 0x0000100B,   // additional calendar types specifier
            LOCALE_IFIRSTDAYOFWEEK = 0x0000100C,   // first day of week specifier
            LOCALE_IFIRSTWEEKOFYEAR = 0x0000100D,   // first week of year specifier
            LOCALE_SDAYNAME1 = 0x0000002A,   // long name for Monday
            LOCALE_SDAYNAME2 = 0x0000002B,   // long name for Tuesday
            LOCALE_SDAYNAME3 = 0x0000002C,   // long name for Wednesday
            LOCALE_SDAYNAME4 = 0x0000002D,   // long name for Thursday
            LOCALE_SDAYNAME5 = 0x0000002E,   // long name for Friday
            LOCALE_SDAYNAME6 = 0x0000002F,   // long name for Saturday
            LOCALE_SDAYNAME7 = 0x00000030,   // long name for Sunday
            LOCALE_SABBREVDAYNAME1 = 0x00000031,   // abbreviated name for Monday
            LOCALE_SABBREVDAYNAME2 = 0x00000032,   // abbreviated name for Tuesday
            LOCALE_SABBREVDAYNAME3 = 0x00000033,   // abbreviated name for Wednesday
            LOCALE_SABBREVDAYNAME4 = 0x00000034,   // abbreviated name for Thursday
            LOCALE_SABBREVDAYNAME5 = 0x00000035,   // abbreviated name for Friday
            LOCALE_SABBREVDAYNAME6 = 0x00000036,   // abbreviated name for Saturday
            LOCALE_SABBREVDAYNAME7 = 0x00000037,   // abbreviated name for Sunday
            LOCALE_SMONTHNAME1 = 0x00000038,   // long name for January
            LOCALE_SMONTHNAME2 = 0x00000039,   // long name for February
            LOCALE_SMONTHNAME3 = 0x0000003A,   // long name for March
            LOCALE_SMONTHNAME4 = 0x0000003B,   // long name for April
            LOCALE_SMONTHNAME5 = 0x0000003C,   // long name for May
            LOCALE_SMONTHNAME6 = 0x0000003D,   // long name for June
            LOCALE_SMONTHNAME7 = 0x0000003E,   // long name for July
            LOCALE_SMONTHNAME8 = 0x0000003F,   // long name for August
            LOCALE_SMONTHNAME9 = 0x00000040,   // long name for September
            LOCALE_SMONTHNAME10 = 0x00000041,   // long name for October
            LOCALE_SMONTHNAME11 = 0x00000042,   // long name for November
            LOCALE_SMONTHNAME12 = 0x00000043,   // long name for December
            LOCALE_SMONTHNAME13 = 0x0000100E,   // long name for 13th month (if exists)
            LOCALE_SABBREVMONTHNAME1 = 0x00000044,   // abbreviated name for January
            LOCALE_SABBREVMONTHNAME2 = 0x00000045,   // abbreviated name for February
            LOCALE_SABBREVMONTHNAME3 = 0x00000046,   // abbreviated name for March
            LOCALE_SABBREVMONTHNAME4 = 0x00000047,   // abbreviated name for April
            LOCALE_SABBREVMONTHNAME5 = 0x00000048,   // abbreviated name for May
            LOCALE_SABBREVMONTHNAME6 = 0x00000049,   // abbreviated name for June
            LOCALE_SABBREVMONTHNAME7 = 0x0000004A,   // abbreviated name for July
            LOCALE_SABBREVMONTHNAME8 = 0x0000004B,   // abbreviated name for August
            LOCALE_SABBREVMONTHNAME9 = 0x0000004C,   // abbreviated name for September
            LOCALE_SABBREVMONTHNAME10 = 0x0000004D,   // abbreviated name for October
            LOCALE_SABBREVMONTHNAME11 = 0x0000004E,   // abbreviated name for November
            LOCALE_SABBREVMONTHNAME12 = 0x0000004F,   // abbreviated name for December
            LOCALE_SABBREVMONTHNAME13 = 0x0000100F,   // abbreviated name for 13th month (if exists)
            LOCALE_SPOSITIVESIGN = 0x00000050,   // positive sign
            LOCALE_SNEGATIVESIGN = 0x00000051,   // negative sign
            LOCALE_IPOSSIGNPOSN = 0x00000052,   // positive sign position (derived from INEGCURR)
            LOCALE_INEGSIGNPOSN = 0x00000053,   // negative sign position (derived from INEGCURR)
            LOCALE_IPOSSYMPRECEDES = 0x00000054,   // mon sym precedes pos amt (derived from ICURRENCY)
            LOCALE_IPOSSEPBYSPACE = 0x00000055,   // mon sym sep by space from pos amt (derived from ICURRENCY)
            LOCALE_INEGSYMPRECEDES = 0x00000056,   // mon sym precedes neg amt (derived from INEGCURR)
            LOCALE_INEGSEPBYSPACE = 0x00000057,   // mon sym sep by space from neg amt (derived from INEGCURR)
            LOCALE_FONTSIGNATURE = 0x00000058,   // font signature
            LOCALE_SISO639LANGNAME = 0x00000059,   // ISO abbreviated language name
            LOCALE_SISO3166CTRYNAME = 0x0000005A,   // ISO abbreviated country name
            LOCALE_IDEFAULTEBCDICCODEPAGE = 0x00001012,   // default ebcdic code page
            LOCALE_IPAPERSIZE = 0x0000100A,   // 1 = letter, 5 = legal, 8 = a3, 9 = a4
            LOCALE_SENGCURRNAME = 0x00001007,   // english name of currency
            LOCALE_SNATIVECURRNAME = 0x00001008,   // native name of currency
            LOCALE_SYEARMONTH = 0x00001006,   // year month format string
            LOCALE_SSORTNAME = 0x00001013,   // sort name
            LOCALE_IDIGITSUBSTITUTION = 0x00001014,   // 0 = context, 1 = none, 2 = national
            LOCALE_SNAME = 0x0000005c,   // locale name (with sort info) (ie: de-DE_phoneb)
            LOCALE_SDURATION = 0x0000005d,   // time duration format
            LOCALE_SKEYBOARDSTOINSTALL = 0x0000005e,   // (windows only) keyboards to install
            LOCALE_SSHORTESTDAYNAME1 = 0x00000060,   // Shortest day name for Monday
            LOCALE_SSHORTESTDAYNAME2 = 0x00000061,   // Shortest day name for Tuesday
            LOCALE_SSHORTESTDAYNAME3 = 0x00000062,   // Shortest day name for Wednesday
            LOCALE_SSHORTESTDAYNAME4 = 0x00000063,   // Shortest day name for Thursday
            LOCALE_SSHORTESTDAYNAME5 = 0x00000064,   // Shortest day name for Friday
            LOCALE_SSHORTESTDAYNAME6 = 0x00000065,   // Shortest day name for Saturday
            LOCALE_SSHORTESTDAYNAME7 = 0x00000066,   // Shortest day name for Sunday
            LOCALE_SISO639LANGNAME2 = 0x00000067,   // 3 character ISO abbreviated language name
            LOCALE_SISO3166CTRYNAME2 = 0x00000068,   // 3 character ISO country name
            LOCALE_SNAN = 0x00000069,   // Not a Number
            LOCALE_SPOSINFINITY = 0x0000006a,   // + Infinity
            LOCALE_SNEGINFINITY = 0x0000006b,   // - Infinity
            LOCALE_SSCRIPTS = 0x0000006c,   // Typical scripts in the locale
            LOCALE_SPARENT = 0x0000006d,   // Fallback name for resources
            LOCALE_SCONSOLEFALLBACKNAME = 0x0000006e,   // Fallback name for within the console
        }
        /// <summary>
        /// 获取系统当前的是否显示前导零设置
        /// </summary>
        /// <returns>0:不显示前导0     1:显示前导0</returns>
        public int getIfShowLeadingZero()
        {
            StringBuilder lpLCData = new StringBuilder(10);
            StringBuilder localeName = new StringBuilder(20);
            GetUserDefaultLocaleName(localeName, 20);
            GetLocaleInfoEx(localeName.ToString(), LCTYPE.LOCALE_ILZERO, lpLCData, 10);
            return Convert.ToInt32(lpLCData.ToString());
        }

在设置IUNiqueValueRender的值时,如果值在-1 - +1之间,若显示前导0(getIfShowLeadingZero()==1),

则不予处理;否则(getIfShowLeadingZero()==0)将前导的“0.”替换为“.”。

其他处理方式不变。

问题是解决了,但系统中的“起始零显示”难道不应该只是影响数据的显示么?在此怎么影响到数据的查询了?

posted on 2011-04-01 20:49  調皮↙不搗蛋  阅读(3213)  评论(0编辑  收藏  举报