我将aspx页面上的Datalist Control移动到usercontrol并将其引用到aspx页面。在这个过程中,我还移动了datalist的源代码(ItemDataBound和Display方法)。我使用“数据表”作为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>
有什么事吗?如果我能提供更多关于此的信息(代码),请告知我......提前感谢您的宝贵帮助
答案 0 :(得分:2)
最可能的原因是dt
未设置。
下一个最相似的原因是dlspec_ItemDataBound
实际上抛出了异常。
这就是为什么查看异常调用堆栈非常重要的原因,如果可用,请将其包含在您的问题中。
要从代码中捕获的异常中获取大量有用信息,可以调用它的ToString方法。例如,在你的catch块中:
Console.Write(ex.ToString();
<强>更新强>
我对问题的根源有所了解,这是我们多次遇到的问题(假设您使用的是Web应用程序项目):
如果您将控件从一个页面/用户控件移动到另一个页面/用户控件,只需从页面/用户控件源切换并粘贴标记,而>>在进行更改后切换到设计模式,Visual Studio会执行此操作并不总是更新设计器文件中的引用。
如果打开用户控件的设计器文件,可以通过搜索dlspec来确认。如果不在那里,这就是问题的根源。
因为我们被这么多次击中,每当我们移动这样的控件时,我们总是切换到设计模式,弄脏东西,然后保存。为了安全起见,我们通常会仔细检查设计器文件,以确保删除上一个条目并重新读入新条目。
答案 1 :(得分:2)
如果您的DataList出现null,则问题是FindControl未找到您的datalist控件的结果。斯科特·艾伦(Scott Allen)就此话题提出了一个很好的article。如果DataTable为null,那么它会在代码中的某处消失。
尝试这样来查明问题:
DataTable dt1 = dt; // Set breakpoint here; check dt1 and dl1 to pinpoint prob
DataList dl1 = (DataList) this.FindControl("dlspec");
dl1.DataSource = dt1;
dl1.DataBind();
设置我在注释中指示的断点,然后逐步查看数据表是否为空。然后检查并查看FindControl方法是否返回控件,或者它是否为null。
答案 2 :(得分:1)
我想我解决了这个...... 因此,DisplaySpecification(...)方法是从用户控件注册到的aspx页面的Page_load()调用的。 我将此调用移动到aspx的Page_PreRender()事件,它工作正常。 原因是在aspx page_load()事件完成之前,用户控件实际上并未加载。这就是为什么我把'dlspec'作为null。 我感谢你们所有的帮助......你们真棒。
再次感谢