我是C#和Sharepoint Programming的新手。
我正在尝试了解其上使用的WebPart和C#。我做了一个可视webpart,在列表中添加/删除项目。我有一个方法,在按钮点击上调用,在列表中添加项目。
这是我的方法:
public void TestMethod()
{
using (SPSite oSPSite = SPContext.Current.Site)
{
using (SPWeb ospweb = oSPSite.OpenWeb())
{
SPList lst = ospweb.Lists["CusomList1"];
SPListItem item = lst.Items.Add();
item["Item1"] = txt1.Text;
item["Item2"] = txt3.Text;
item["Item3"] = Convert.ToInt32(txt3.Text);
item["Item4"] = txt4.Text;
item.Update();
}
}
}
这称为:
protected void Button1_Click(object sender, EventArgs e)
{
TestMethod();
}
这很好用。我试图在第二个WebPart上使用相同的方法,它做同样的事情(添加项目)。
然而,当我在同一个项目中添加一个新的Visual Webpart并将该类和方法称为
时protected void Button1_Click(object sender, EventArgs e)
{
VWP1 NewClass = new VWP1();
NewClass.TestMethod();
}
此“添加”按钮不起作用,当我进行调试时,我收到以下消息:
Object reference not set to an instance of an object.
有人可以告诉我该怎么办?
答案 0 :(得分:1)
您需要做的是将列表中的项目与用户界面交互的逻辑分开。
创建一个单独的函数,用于保存数据并保存:
public static void SaveItem(string item1, string item2, int item3, string item4)//TODO rename parameters
{
SPListItem newItem = SPContext.Current.Web.Lists["CusomList1"].AddItem();
//set fields of new item
newItem.Update();
}
然后你可以将该方法放在某个实用程序类中。
完成后,您可以从每个Web部件调用该方法:
protected void Button1_Click(object sender, EventArgs e)
{
MyUtilityClass.SaveItem(txt1.Text, txt2.Text, Convert.ToInt32(txt3.Text), txt4.Text);
}
至于为什么,这里有很多事情要发生。主要问题是,当您创建第一个可视webpart的新实例并调用该方法时,它不会访问第二个webpart的文本框值,而是访问新创建的webpart的文本框值;从未向用户显示或由ASP初始化的那个。因为ASP(或你)从未调用它的初始化函数,所以textbox字段都是null,因此你的错误。如果你做了初始化,那么他们都有空的文本值,它仍然无法帮助你。与文本框的交互需要在每个不同的webpart中发生;你不能(或者至少不应该;允许它这是不好的做法)从另一个类访问内部控件。除了实际的UI交互之外,你可以移动到另一个类的是什么;在这种情况下,将项目保存到列表中。
几个旁注:
using
块中;将处置它。 不要那样做。仅处理您创建的站点/ Web对象。当前上下文的站点/ Web对象被重用于不同的请求;如果你处理它,那个请求就会起作用,但是当被处置的对象被传递给下一个请求时它会中断,并且由于问题完全出现在另一个请求中,因此通常很难调试错误。 SPContext.Current.Web.RootWeb
访问它而无需打开新网站。Convert.ToInt32
。如果它们没有输入正确的数字,如果它们包含逗号等,则会中断。请考虑使用int.TryParse
,以便在输入无效值时可以更优雅地失败。list.Items.Add()
添加项目;你应该使用list.AddItem()
。 Items.Add
被视为已弃用。