У меня есть веб-сайт .net, над которым я работаю, и использующий повторители для построения нескольких таблиц.Как часть Databind, я добавляю ключи к объекту словаря на уровне класса, чтобы позже я мог их вызвать и проверить, были ли они изменены.Ниже приведен мой код:
public partial class pointsEdit : System.Web.UI.Page
{
public Dictionary<Int32, TextBox[]> PointsValues;
protected void Page_Load(object sender, EventArgs e)
{
Int32 clientID = 0;
if (Request.QueryString["id"] != null)
{
if (Int32.TryParse(Request.QueryString["id"], out clientID) == true) {
//try
//{
if (!IsPostBack)
{
btnReturn.HRef = "clientEdit.aspx?id=" + clientID;
PointsValues = new Dictionary<int, TextBox[]>();
using (var db = new db())
{
var ev = db.activityPoints.Where(x => x.ClientID == clientID).ToArray();
tblEvent.DataSource = ev;
tblEvent.DataBind();
}
}
//}
//catch
//{
//}
}
}
}
protected void tblEvent_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
using (var db = new db())
{
Int32 TypeKey;
Int32 ActivityID;
Int32.TryParse(DataBinder.Eval(e.Item.DataItem,"TypeKey").ToString(),out TypeKey);
Int32.TryParse(DataBinder.Eval(e.Item.DataItem, "ActivityID").ToString(), out ActivityID);
var ev = db.events.Where(x => x.ID == TypeKey).First();
((Label)e.Item.FindControl("lblEvent")).Text = ev.name.ToString();
((TextBox)e.Item.FindControl("tbPointValue")).Text = DataBinder.Eval(e.Item.DataItem, "MaxPointsEach").ToString();
((TextBox)e.Item.FindControl("tbMaxScored")).Text = DataBinder.Eval(e.Item.DataItem, "MaxAttempts").ToString();
PointsValues.Add(ActivityID, new TextBox[] { ((TextBox)e.Item.FindControl("tbPointValue")), ((TextBox)e.Item.FindControl("tbMaxScored")) });
}
}
protected void btnSubmit_Click(object sender, EventArgs e)
{
Int32 ActivityID;
TextBox[] TextBoxes;
Int32 clientID = 0;
Int32 ParseResult = 0;
Int32 MaxPoints = 0;
Int32 MaxAttempts = 0;
Boolean NeedsUpdate = false;
if (Request.QueryString["id"] != null)
{
if (Int32.TryParse(Request.QueryString["id"], out clientID) == true)
{
//try
//{
using (var db = new db())
{
var s = db.activityPoints.Where(x => x.ClientID == clientID).ToArray();
for (int i = 0; i < s.Length; i++)
{
ActivityID = s[i].ActivityID;
TextBoxes = PointsValues[ActivityID];
}
}
//} catch {
//}
}
}
}
}
В блоке больше кода, который фактически обновляет значения, но мой цикл только заходит так далеко, поэтому я для простоты удаляю его.Когда он попадает в «TextBoxes = PointsValues [ActivityID];»В строке метода submit создается впечатление, что объект Dictionary больше не заполняется.
Я проверил, что при добавлении в словарь есть идентификатор активности, и количество верных соответствует количеству объектов, которые должны были быть добавлены.В строке Textboxes, однако, он говорит мне, что «данного ключа не было в словаре», и когда я пытаюсь получить счетчик, он выдает ошибку «ссылка на объект не установлена для экземпляра объекта».Если я устанавливаю объект словаря в новый объект словаря непосредственно перед этой строкой, это позволяет мне получить счетчик (из 0).Кажется, что объект как-то сбрасывается после установки.Есть идеи?