今天我遇到了一个非常奇怪的问题,由存储过程,自动完成程序和事件处理组成。如果有人可以为下面的传奇建议一个简明的标题,请做!
首先我会尝试介绍玩家(有些部分有点删节),然后是场景。环境是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:
现在,当用户从自动填充列表中选择一个项目时,会发生以下情况:
对于这种情况,键入的数据行中的“复合”字段必须是这样的:
“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:在数据行中添加了有关空格和下划线的注释。
答案 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方法。