尽管使用usercontrol检查null,但checkboxlist返回的对象引用未设置为对象的实例

时间:2018-03-28 23:25:49

标签: asp.net c#-4.0 visual-studio-2017

我在checkboxlist用户控件中有一组7个复选框。我在selectedIndexchanged事件中为选中的框构建一个字符串,传递给ViewState,然后将ViewState传递给Property。我这样做是因为在没有选中复选框的情况下我想处理null。问题是无论我如何检查null,系统都会抛出对象引用错误。如果选中至少一个复选框但如果未选中任何复选框,则此当前设置可正常工作。我如何检查null?我应该在属性或主机aspx页面中检查null吗? 我已经研究了不同的方法来做到这一点,我尝试了很多。我的想法是使用IsNullOrEmptyIsNullOrWhiteSpace将是正确的方法,但两个都没有工作。

  

用户控件类 - 全局变量

private string _daysOffInputString = string.Empty;
  

用户控制属性

 public string DaysOffSelectedValues
                    {
                        get
                        {
                            if (string.IsNullOrEmpty(ViewState["DaysOff"].ToString()))
                            {
                                 _daysOffInputString = string.Empty;
                            }
                            else
                            {
                                _daysOffInputString = ViewState["DaysOff"].ToString();
                            }
                            return _daysOffInputString;
                        }
                            set { _daysOffInputString = value; }
  

用户控制事件

    protected void CbDaysOff_SelectedIndexChanged(object sender, EventArgs e)
            {
                CheckBoxList chkbx = (CheckBoxList)sender;

                StringBuilder sb = new StringBuilder();

                for (int i = 0; i < chkbx.Items.Count; i++)
                {
                    if (chkbx.Items[i].Selected)
                    {
                        sb.Append(chkbx.Items[i].Text + ", ");
                    }

                    if (!String.IsNullOrEmpty(sb.ToString()))
                    {
                        //Remove last comma & space from string
                        _daysOffInputString = sb.ToString().Substring(0, sb.ToString().Length - 2);
                    }
                    else
                    {
                        _daysOffInputString = string.Empty;
                    }
                }

                ViewState["DaysOff"] = _daysOffInputString;
            }

aspx页面 - 我在其中检索uc属性值的片段:

      case 2:
           blnFlag = false;
           ucDaysOff uc3 = row.Cells[3].FindControl("ucDaysOff3") as ucDaysOff;      
           strAnswer = uc3.DaysOffSelectedValues;      //e.g. "Sat, Sun"

                            break;   

解决方案:在用户控件属性DaysOffSelectedValues中,我在检查null之前将ViewState["DaysOff"]转换为字符串,这是问题所在。以下是有效的代码:

public string DaysOffSelectedValues
    {
        get
        {
            if (ViewState["DaysOff"] == null)
            {
                //_daysOffInputString = string.Empty; }

                _daysOffInputString = "Nothing to see here.";
            }
            else
            {
                _daysOffInputString = ViewState["DaysOff"].ToString();
            }
            return _daysOffInputString;
        }
        set { _daysOffInputString = value; }
    }

1 个答案:

答案 0 :(得分:0)

在使用之前,应始终检查对象(在本例中为ViewState)是否为null。可以说ViewState["DaysOff"]尚未创建或已被删除。

然后这会抛出一个空引用:

string str = String.IsNullOrEmpty(ViewState["DaysOff"].ToString());

因为您没有检查ViewState对象是否为null,而是它应该保留的字符串。

这样做

if (ViewState["DaysOff"] != null)
{
    string str = ViewState["DaysOff"].ToString();
}