ASP.NET AutoCompleteExtender启用TextBox的TextChanged事件在从AutoCompleteExtender中选择某种项目时不会触发(哇......)

时间:2009-09-25 09:58:52

标签: asp.net stored-procedures autocomplete event-handling ajaxcontroltoolkit

今天我遇到了一个非常奇怪的问题,由存储过程,自动完成程序和事件处理组成。如果有人可以为下面的传奇建议一个简明的标题,请做!

首先我会尝试介绍玩家(有些部分有点删节),然后是场景。环境是VS2008,C#,SQL Server 2005和ASP.NET。

数据库表:

TABLE (
 SomeNbr  INT,
 SomeAbbr VARCHAR(10),
 Name     VARCHAR(30)
)

StoredProcedure的:

阅读上表并返回如下内容:

DECLARE @Results TABLE
(
    SomeNbr INT,
    --Composite CHAR(50), -- voodoo magic starts here...
    Composite VARCHAR(50)
) 

返回表的Composite-field由SomeNbr,SomeAbbr和Name字段组成。它们被附加在一起并用逗号分隔(f.ex。“number,abbreviation,name”)。

存储过程用于从db检索一组行,并将这些行放入类型化的数据表中。然后将该数据表存储在会话变量中。 DataTable的XSD-Schema具有“Composite”-field的数据类型String。

!重要!对于db中的某些行,“Name”-field包含实际值和rpadding(由空格组成),最大长度为。其他只包含没有rpadding的名称。

用户界面(带代码隐藏的ASPX页面):

我扩展了文本框控件,以包含来自AJAX Control Toolkit的AutoCompleteExtender。控制声明如下:

<ajx:TextControl ID="txtControl" 
                 runat="server" 
                 AutoPostBack="true" 
                 UseAutoComplete="true" 
                 ServiceMethod="GetItems" 
                 MinimumPrefixLength="1" />

ui上还有一些额外的基本文本框。

代码隐藏:

AutoCompleteExtender使用以下webmethod:

[System.Web.Services.WebMethod]
public static string[] GetItems(string prefixText, int count)
{
    try
    {
        return Utility.GetMatchingStrings(_DataTableInSession, prefixText);
    }        
    catch (Exception ex)
    {
        throw;
    }
}

GetMatchingStrings(...) - 方法将preFixText与_DataTableInSession中的所有数据行进行比较,并返回匹配字符串的数组。使用数据行的“复合”字段进行比较。

在codebehind中,事件处理程序设置为:

extendedTextControl.Control.TextChanged += PopulateTextControls;    

,并且:

private void PopulateTextControls(object sender, EventArgs e)
{
    // Read Text-property from extended textcontrol
    string str = extendedTextControl.Text;

    // Split string by commas and take parts into an array
    string[] arrStr = SplitString(",", str);

    // Set the values in array to Text-properties of TextBoxes
    SetValuesToTextBoxes(arrStr, _TextBoxes);
}

方案

一切似乎都很好,扩展的TextControl按预期工作,并在文本框下面生成可选列表。

场景1:

现在,当用户从自动填充列表中选择一个项目时,会发生以下情况:

  1. 所选字符串设置为扩展文本控件的Text-property
  2. textcontrol的autopostback发生
  3. 在回发时,为textcontrol的TextChanged-event注册了一个eventhandler
  4. 触发TextChanged事件,其他文本框按预期填充数据
  5. 对于这种情况,键入的数据行中的“复合”字段必须是这样的:

    “10”,“10,ABBR,某些名字在这里____ ......”(&lt; - 空格用下划线代替)

    如果数据行更像是这样:

    “10”,“10,ABBR,有些名字在这里”

    然后我们会去......

    场景2:

    以上是一种快乐的日子 - 场景: - )

    如果匹配的数据行是从db中的一行开始的,其中“Name”-field 用空格填充,最大长度为(VARCHAR(50)) ,然后TextChanged事件不会被触发。

    我花了几个小时试图找出上面的一切。首先,我很困惑为什么选择自动填充列表中的某些项目的****确实有效,而有些则没有。

    当我意识到要查看数据表的内容时,我看到有些行有填充而其他行没有。之后,我试图在SP的返回表中删除(rtrim())所有内容,并且没有任何项目可用了。

    之后我尝试将SP的返回值设置为CHAR(50)而不是VARCHAR(50),并修复它。

    问题:

    我的申请中发生了什么?为什么注册的活动没有开火?就像TextChanged只适用于一定长度的字符串(VARCHAR(50)的最大长度),但这怎么可能呢?

    问题解决了,但我不明白为什么。在办公室的另一天,我想: - )

    我很乐意提供更多数据和说明!

    编辑1:在数据行中添加了有关空格和下划线的注释。

1 个答案:

答案 0 :(得分:0)

  

之后我尝试将SP的返回值设置为CHAR(50)而不是VARCHAR(50),并修复它。

我不了解整个场景,但我会看看CHAR(50)与VARCHAR(50)的问题。我也不知道“WebOlkiUtility.GetMatchingStrings”的作用。

declare @text char(50)
select @text = 'test'

select @text

declare @text2 varchar(50)
select @text2 = 'test2'

select @text2

-- output --
CHAR(50): 'test                                              '
VARCHAR(59): 'test2'

CHAR(50)总是返回50个字符!

BTW:你为什么这样附上活动?

if (GetPostBackingControlId() == extendedTextControl.ID)
{
    extendedTextControl.Control.TextChanged += PopulateTextControls;
}

你总是可以附上它。在您的ASPX文件或Page_Init方法。