比如有
挑灯夜读
阿拉伯电脑
晚上银行
电子书籍
美女跳舞等等我在textbox框里输入T
下拉列表显示 挑灯夜读
             美女跳舞
让我选择这里基于的原理是 汉字字母的拼音字母,挑灯夜读的挑 是T开头的,美女跳舞的跳是T开头的这个怎么实现?
我想到,一种笨方法是,提前在数据库里对每个汉字组合都附带所有的拼音首字母的字段
比如挑灯夜读,我对应加3个字段 T D Y 不过好像这样太笨了,如果这些数据是动态添加的或者字很多那不得累死啊
不知道有什么好一点的办法可以实现这个效果??

解决方案 »

  1.   

    我就是用这种笨方法实现的, 在动态添加数据时, 同步获取该数据的拼音码字母。
    如下:
            /// <summary>
            /// 得到每个汉字的字首拼音码字母(大写)
            /// </summary>
            /// <param name="chrStr">输入字符串</param>
            /// <returns>返回结果</returns>
            public string GetHeadCharacter(string chrStr)
            {
                string strHeadString = string.Empty;            Encoding gb = System.Text.Encoding.GetEncoding("gb2312");
                for (int i = 0; i < chrStr.Length; i++)
                {
                    //检测该字符是否为汉字
                    if (!IsChineseCharacters(chrStr.Substring(i, 1)))
                    {
                        strHeadString += chrStr.Substring(i, 1);
                        continue;
                    }                byte[] bytes = gb.GetBytes(chrStr.Substring(i, 1));
                    string lowCode = System.Convert.ToString(bytes[0] - 0xA0, 16);
                    string hightCode = System.Convert.ToString(bytes[1] - 0xA0, 16);
                    int nCode = Convert.ToUInt16(lowCode, 16) * 100 + Convert.ToUInt16(hightCode, 16);      //得到区位码
                    strHeadString += FirstLetter(nCode);
                }
                return strHeadString;
            }希望有更好的方法。
      

  2.   

    还有一部分代码没贴完。
            /// <summary>  
            /// 判断字符是否为汉字  
            /// </summary>  
            /// <param   name="chrStr">待检测字符串</param>  
            /// <returns>是汉字返回true</returns>  
            public bool IsChineseCharacters(string chrStr)
            {
                Regex CheckStr = new Regex("[\u4e00-\u9fa5]");
                return CheckStr.IsMatch(chrStr);
            }
            /// <summary>
            /// 通过汉字区位码得到其首字母(大写)
            /// </summary>
            /// <param name="nCode">汉字编码</param>
            /// <returns></returns>
            private string FirstLetter(int nCode)
            {
                if (nCode >= 1601 && nCode < 1637) return "A";
                if (nCode >= 1637 && nCode < 1833) return "B";
                if (nCode >= 1833 && nCode < 2078) return "C";
                if (nCode >= 2078 && nCode < 2274) return "D";
                if (nCode >= 2274 && nCode < 2302) return "E";
                if (nCode >= 2302 && nCode < 2433) return "F";
                if (nCode >= 2433 && nCode < 2594) return "G";
                if (nCode >= 2594 && nCode < 2787) return "H";
                if (nCode >= 2787 && nCode < 3106) return "J";
                if (nCode >= 3106 && nCode < 3212) return "K";
                if (nCode >= 3212 && nCode < 3472) return "L";
                if (nCode >= 3472 && nCode < 3635) return "M";
                if (nCode >= 3635 && nCode < 3722) return "N";
                if (nCode >= 3722 && nCode < 3730) return "O";
                if (nCode >= 3730 && nCode < 3858) return "P";
                if (nCode >= 3858 && nCode < 4027) return "Q";
                if (nCode >= 4027 && nCode < 4086) return "R";
                if (nCode >= 4086 && nCode < 4390) return "S";
                if (nCode >= 4390 && nCode < 4558) return "T";
                if (nCode >= 4558 && nCode < 4684) return "W";
                if (nCode >= 4684 && nCode < 4925) return "X";
                if (nCode >= 4925 && nCode < 5249) return "Y";
                if (nCode >= 5249 && nCode < 5590) return "Z";
                return "";
            }
      

  3.   

    先问一下你用的是2008?private void Form1_Load(object sender, EventArgs e)
            {
                AutoCompleteStringCollection strings = new AutoCompleteStringCollection();  //定义自动集合
                //初始化集合
                strings.Add ("挑灯夜读");
                strings.Add("阿拉伯电脑");
                strings.Add ("晚上银行");
                strings.Add ("电子书籍");
                strings.Add("美女跳舞");            //绑定控件
                textBox1.AutoCompleteCustomSource = strings;
                textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
                textBox1.AutoCompleteMode = AutoCompleteMode.Suggest;
            }
            
      

  4.   

    /// <summary>
            /// 得到每个汉字的字首拼音码字母(大写)
            /// </summary>
            /// <param name="chrStr">输入字符串</param>
            /// <returns>返回结果</returns>
            public string GetHeadCharacter(string chrStr)
            {
                string strHeadString = string.Empty;            Encoding gb = System.Text.Encoding.GetEncoding("gb2312");
                for (int i = 0; i < chrStr.Length; i++)
                {
                    //检测该字符是否为汉字
                    if (!IsChineseCharacters(chrStr.Substring(i, 1)))
                    {
                        strHeadString += chrStr.Substring(i, 1);
                        continue;
                    }                byte[] bytes = gb.GetBytes(chrStr.Substring(i, 1));
                    string lowCode = System.Convert.ToString(bytes[0] - 0xA0, 16);
                    string hightCode = System.Convert.ToString(bytes[1] - 0xA0, 16);
                    int nCode = Convert.ToUInt16(lowCode, 16) * 100 + Convert.ToUInt16(hightCode, 16);      //得到区位码
                    strHeadString += FirstLetter(nCode);
                }
                return strHeadString;
            }
      

  5.   

    晕,那我要是从数据库里取出来呢?数据量大咋办?
    绑定在textbox下面还有用吗?
      

  6.   

    占位,一直想了解这个在PPS的搜索中也提供了这么一个功能,我的想法也是保存拼音
      

  7.   

    行呀,这个没问题,用的方法同样,不过代码最好写在Form1_load中