список данных в usercontrol выдает исключение nullreference при попытке назначить источник данных - PullRequest
1 голос
/ 06 января 2012

Я переместил элемент управления Datalist на странице aspx в usercontrol и сослался на страницу aspx. В процессе я также переместил исходный код для списка данных (методы ItemDataBound и Display). Я использую "Datatable" в качестве источника для населения Datalist. после того, как я переместил элемент управления в пользовательский элемент управления, он выбрасывает мне NullReference, когда я пытаюсь назначить объект данных в качестве источника для списка данных.

public partial class Controls_ProductSpecifications : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //no code yet here...
    }

    public void DisplaySpecifications(SearchResultItem sri,bool IsMobilePage)
    {
        List<Category> breadcrumbCategories = sri.BreadcrumbCategories;
        Category templateCat =  breadcrumbCategories[breadcrumbCategories.Count - 1];

        ParametricColumnSortOrder customDimSortOrder = null;
        int rowPosition = 0; // manufacturer, product category, rohs
        bool isUnclassified = false;

        // -- get the sorted parametric list from database
        if (templateCat.Id.ToString() != null)
            customDimSortOrder = new ParametricColumnSortOrder(Convert.ToInt64(templateCat.Id), false, true);

        //List<ParametricAttributeGroup> plist = sri.ParametricDimensions;
        if (breadcrumbCategories[0].Name == "Unclassified")
        {
            ////if (breadcrumbCategories.Count > 1)
            ////{
            ////    //---{ Create an unclassifed attribute group } 
            ////    ParametricAttributeGroup pag = new ParametricAttributeGroup(breadcrumbCategories[0].Id, breadcrumbCategories[0].Name);
            ////    pag.ParametricAttributes.Add(new ParametricAttribute(breadcrumbCategories[1].Id, breadcrumbCategories[1].Name));
            ////    plist.Add(pag);
            ////}
        }

        var dt = new DataTable();
        dt.Columns.Add("Dimension");
        dt.Columns.Add("DimensionID");
        dt.Columns.Add("Attribute");
        dt.Columns.Add("AttributeID");
        dt.Columns.Add("CheckBox");
        dt.Columns.Add("CheckBoxState");

        DataRow dr;

        List<ParametricAttributeGroup> translatedAttGrp = sri.ParametricDimensions;

        LanguageDataAccess.GetTranslatedAttributes(translatedAttGrp, Language.CurrentLanguageCulture);

        foreach (ParametricAttributeGroup attributeGroup in translatedAttGrp)
        {
            ParametricAttribute attribute = attributeGroup.ParametricAttributes[0];

            dr = dt.NewRow();
            dr["Dimension"] = attributeGroup.Name;
            dr["DimensionID"] = attributeGroup.Id;
            dr["Attribute"] = attribute.Value;
            dr["AttributeID"] = attribute.Id;
            dr["CheckBox"] = "false";

            string grpname = attributeGroup.Name;
            // -- get the original name instead of the translated name for comparision --
            if (attributeGroup is LocalizationParametricAttributeGroup)
            {
                grpname = ((LocalizationParametricAttributeGroup)attributeGroup).OriginalName;
            }

            if (grpname == "Manufacturer")
            {
                dr["Dimension"] = Resources.MyMouser.lblManufacturer;
                dr["CheckBoxState"] = "0";
                dt.Rows.InsertAt(dr, rowPosition);
                rowPosition++;
            }
            else if (grpname == "Product Category")
            {
                // -- don't show product category if this product is under Unclassified --

                isUnclassified = breadcrumbCategories.Any(cat => cat.Name == Resources.MyMouser.lblUnclassified);

                if (!isUnclassified)
                {
                    dr["Dimension"] = attributeGroup.Name;
                    dr["Attribute"] = templateCat.Name;
                    dr["AttributeID"] = templateCat.Id;
                    dr["CheckBoxState"] = "0";
                    dt.Rows.InsertAt(dr, rowPosition);
                    rowPosition++;
                }
            }
            else if (grpname == "Unclassified")
            {
                dr["Dimension"] = Resources.MyMouser.lblUnclassified;
                dr["CheckBoxState"] = "0";
                dt.Rows.InsertAt(dr, rowPosition);
                rowPosition++;
            }
            else if (grpname == "RoHS - Mouser")
            {
                dr["Dimension"] = Resources.MyMouser.litHeaderRoHS;
                dr["Attribute"] = SearchHelper.CreateRoHSLabel(sri,sri.EnRoHSStatus, isUnclassified,IsMobilePage);
                dt.Rows.InsertAt(dr, rowPosition);
                rowPosition++;
            }
            else if (grpname == "Standard Pack Qty")
            {
                dr["Dimension"] = Resources.MyMouser.lblfactrPakcQty;
                dt.Rows.Add(dr);
            }
            else
            {
                dt.Rows.Add(dr);
            }
        }

        // -- sort the visiable fields --
        if (customDimSortOrder != null)
        {
            for (int dimSortIndex = 0; dimSortIndex < customDimSortOrder.Count; dimSortIndex++)
            {
                foreach (DataRow oldRow in dt.Rows)
                {
                    if (customDimSortOrder.AllKeys[dimSortIndex] == oldRow["DimensionID"].ToString())
                    {
                        dr = dt.NewRow();
                        dr["Dimension"] = oldRow["Dimension"];
                        dr["DimensionID"] = oldRow["DimensionID"];
                        dr["Attribute"] = oldRow["Attribute"];
                        dr["AttributeID"] = oldRow["AttributeID"];
                        dr["CheckBoxState"] = "0";
                        dt.Rows.Remove(oldRow);
                        dt.Rows.InsertAt(dr, rowPosition);
                        rowPosition++;
                        break;
                    }
                }
            }
        }

        //aliases information - shawn weng
        if (sri.Aliases != "")
        {
            dr = dt.NewRow();
            dr["Dimension"] = Resources.MyMouser.lblpartaliases;
            dr["DimensionID"] = 0;
            dr["Attribute"] = sri.Aliases;
            dr["AttributeID"] = 0;
            dr["CheckBox"] = "false";
            dt.Rows.Add(dr);
        }
        try
        {
            DataList dl1 = (DataList) this.FindControl("dlspec");
            dl1.DataSource = dt;
            dl1.DataBind();
        }
        catch (Exception ex)
        {
            throw;
        }

    }

    protected void dlspec_ItemDataBound(object sender, DataListItemEventArgs e)
    {
        if ((e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            && e.Item.DataItem != null)
        {
            // -- checkbox --
            var ck = e.Item.FindControl("FindSimilarCheckbox") as CheckBox;
            if (ck != null)
            {
                ck.ID = ck.Text;
                ck.Text = "";

                var lbldim = e.Item.FindControl("lblDimension") as Label;
                if (lbldim != null)
                {
                    if (lbldim.Text.Contains(Resources.MyMouser.lblManufacturer) || lbldim.Text.Contains(Resources.MyMouser.lblProductCategory))
                    {
                        ck.Checked = true;
                    }
                    if (lbldim.Text.Contains(Resources.MyMouser.lblfactrPakcQty))
                    {

                        string PackageQtylnk = "<a href=JAVASCRIPT:OpenFactoryQty();>" + Resources.MyMouser.lblfactrPakcQty + "</a>";
                        lbldim.Text = string.Format(PackageQtylnk);
                        lbldim.CssClass = "factorypackage";
                    }
                }
            }
        }
    }
}

вот разметка страницы ascx:

<%@ Control Language="C#" AutoEventWireup="true"  CodeBehind="ProductSpecifications.ascx.cs" Inherits="MouserWeb.Controls.Controls_ProductSpecifications" %>
<asp:DataList ID="dlspec" runat="server" GridLines="Vertical" OnItemDataBound="dlspec_ItemDataBound">
    <FooterStyle BackColor="#CCCCCC" />
    <AlternatingItemStyle CssClass="alt-grey" />
    <SelectedItemStyle BackColor="#000099" Font-Bold="True" ForeColor="White" />
    <HeaderStyle BackColor="Black" Font-Bold="True" ForeColor="White" />
    <ItemTemplate>
        <table width="550px">
            <tr>
                <td class="leftcol">
                    <asp:Label ID="lblDimension" runat="server" Text='<%# Eval("Dimension") %>'></asp:Label>:
                </td>
                <td class="ProductDetailData">
                    <asp:Label ID="lblName" runat="server" Text='<%# Eval("Attribute") %>'></asp:Label>
                </td>
                <td class="find-similar">
                    <asp:CheckBox ID="FindSimilarCheckbox" runat="server" Checked='<%# Eval("CheckBox")=="true"? true:false %>'
                        Text='<%# Eval("AttributeID") %>' Visible='<%# Eval("CheckBoxState")=="0"? true:false %>' />
                    <%--<input name='<%# Eval("DimensionID") %>' id='<%# Eval("DimensionID") %>' type="checkbox" checked='<%# Eval("CheckBox")=="true"? true:false %>' />--%>
                </td>
            </tr>
        </table>
    </ItemTemplate>
</asp:DataList>

Что-то кажется неправильным? Пожалуйста, дайте мне знать, если я могу предоставить дополнительную информацию (код) об этом ... Заранее спасибо за вашу ценную помощь

Ответы [ 3 ]

2 голосов
/ 06 января 2012

Если ваш DataList обнуляется, проблема заключается в том, что FindControl не находит ваш элемент управления datalist. Вот хорошая статья Скотта Аллена на эту тему. Если DataTable равен нулю, его где-то уничтожают в вашем коде.

Попробуйте, чтобы точно определить проблему:

DataTable dt1 = dt; // Set breakpoint here; check dt1 and dl1 to pinpoint prob
DataList dl1 = (DataList) this.FindControl("dlspec");
dl1.DataSource = dt1;
dl1.DataBind();

Установите точку останова там, где я указал в комментарии, и пройдитесь по ней, чтобы увидеть, является ли datatable нулевым. Затем проверьте и посмотрите, возвращает ли метод FindControl элемент управления или имеет значение null.

2 голосов
/ 06 января 2012

Наиболее вероятной причиной является то, что dt не установлено.

Следующая наиболее похожая причина заключается в том, что исключение фактически выдается в dlspec_ItemDataBound.

Вот почему довольно важно посмотреть на стек вызовов исключений и, если возможно, включить его в свой вопрос.

Чтобы получить большое количество полезной информации из исключения, попавшего в ваш код, вы можете вызвать его метод ToString. Например, в вашем блоке catch:

Console.Write(ex.ToString();

Обновление

У меня есть представление об источнике проблемы, с которой мы сталкивались много раз (при условии, что вы используете проект веб-приложения):

Если вы перемещаете элемент управления с одной страницы / пользовательского элемента управления на другой, просто вырезая и вставляя разметку из страницы / источника пользовательского элемента управления без перехода в режим дизайна после внесения изменений, Visual Studio не делает этого. всегда обновляйте ссылки в файле конструктора.

Если вы откроете файл конструктора для пользовательского элемента управления, вы можете подтвердить это, выполнив поиск dlspec. Если его там нет, то это источник вашей проблемы.

Поскольку мы неоднократно сталкивались с этим, всякий раз, когда мы перемещаем подобные элементы управления, мы всегда переключаемся в режим разработки, что-то пачкаем, а затем сохраняем. И для безопасности мы обычно дважды проверяем файлы конструктора, чтобы убедиться, что предыдущая запись была удалена, а новая запись прочитана.

1 голос
/ 06 января 2012

Я думаю, что я решил это ... Таким образом, метод DisplaySpecification (...) вызывался из Page_load () страницы aspx, на которую зарегистрирован пользовательский элемент управления. Я переместил этот вызов в событие Page_PreRender () aspx, и он работал нормально. Причина в том, что пользовательский элемент управления не загружается до тех пор, пока не завершится событие aspx page_load (). Вот почему я получил 'dlspec' как ноль. Я ценю всю вашу помощь, ребята, вы ... Вы великолепны.

Еще раз спасибо

...