2009-10-28 65 views
0

我想使用ListBox控件的选定值来填充文本框的Text属性和HiddenField及其值属性。这听起来很简单,我这个去:C# - 使用列表框填充其他字段

currentGroupTextBox.Text = currentSiteGroupList.SelectedItem.Text; 
currentGroupHiddenField.Value = currentSiteGroupList.SelectedValue; 

但在执行时,ASP.NET会返回一个错误:

Object reference not set to an instance of an object. 

和亮点的第一道防线。 currentGroupTextBox和currentGroupHiddenField是在ASPX文件中启用的两个控件,所以我不太确定为什么ASP.NET会抱怨实例化它们。

回答

1

我会尝试将所有问题的答案汇总在一起,包括评论中的问题。

  1. 即使SelectionMode="Single",列表框开始时没有什么选择的,除非你指定哪个项目应该在你的代码中选择。

  2. 要测试的SelectedItem为null,使用下面的代码:

if (currentGroupSiteList.SelectedItem != null) { 
    currentGroupTextBox.Text = currentSiteGroupList.SelectedItem.Text; 
    currentGroupHiddenField.Value = currentSiteGroupList.SelectedValue; 
} 
  • 什么是您的Page_Load代码加载列表框是什么样子?它是否包含if (!Page.IsPostBack)支票?如果没有,按下按钮并启动回发将重新加载列表框,从而丢失用户选择的SelectedItem。
  • +0

    就是这样。该列表在每个Page_Load中“重新加载”。什么是最优雅的方式?当页面显示时,我仍然需要加载页面,但是我需要确保SelectedItem不会同时被“重置”。 – Astaar 2009-10-30 14:51:33

    +0

    假设视图状态处于活动状态,则不必在每次回发时加载列表框。所有你需要做的就是在你的列表框加载代码之前加上if(!Page.IsPostPack)。 (实际上,将所有Page_Load代码放入回发检查中是一种很好的做法。 – 2009-10-30 15:05:10

    1

    我愿意打赌,你的第一行在引用currentSiteGroupList.SelectedItem时感到窒息,因为这似乎是最有可能成为空引用的候选者。确保代码在ASP.NET页面生命周期内的正确位置执行,以便在幕后正确设置SelectedItem

    +0

    是不是通过选择列表框中的项目来设置SelectedItem?此时通过单击按钮执行代码,并在Page_Load()中填充该列表。 – Astaar 2009-10-28 22:06:24

    1

    您currentSiteGroupList.SelectedItem中的SelectedItem可能为null(什么表示没有选择)。你需要测试它之前,分配给currentGroupTextBox.Text

    +0

    如何使currentSiteGroupList.SelectedItem不为null,如果不是通过选择列表中的某些东西? SelectionMode被设置为Single,所以我认为即使在没有主动点击ListBox的情况下,默认(第一个)项目最初会至少设置属性? – Astaar 2009-10-28 22:09:46

    +0

    此外,试图测试currentSiteGroupList.SelectedItem返回相同的错误,因为对象仍然没有实例化。 – Astaar 2009-10-28 22:13:08

    +0

    @Furism:SelectedItem属性将为null,除非您手动选择列表上的项目或以编程方式设置SelectedItem/SelectedItem属性。您不能在设计时设置这些属性,因为它们被标记为[Browsable(false)] – 2009-10-29 03:01:27

    0

    它是currentGroupTextBox或currentGroupTextBox是null? 在调试时,如果停在那条线..它是一个或两个都不存在? 我发现的一个常见问题是控件放置在asp窗体视图或类似的控件上,因此对该控件的引用实际上并不是它的id /名称,但更可能需要执行;

    TextBox myTextBoxReference = (TextBox) formName.FindControl("currentGroupTextBox") 
    string theValue = myTextBoxReference.Text 
    

    另一个常见问题是页面生命周期。因此,如果您的对象不在表单上,​​但可能在回发中存在之前引用它。 hth