Проблема с spgridview и spgridviewrow.findcontrol
Вопрос
В веб -части SharePoint я отображаю SpgridView. Управление SPGRIDVIEW находится внутри Ajax UpdatePanel и связан с данным в коде.
Столбцы для Gridview созданы в основном в качестве шаблонов, есть только одно граничное поле. Я создал класс, который наследует Itemplate, который производит ItemTemplate для шаблона. Этот класс также обрабатывает основание данных элементов управления по столбцам/данным в данных DataTable.
У меня есть кнопка за пределами сетки, которая при нажатии предназначена для сохранения изменений, сделанных в данные в Gridview, в базу данных DataTable и Boundsing.
Проблема в том, что я не могу получить ссылку на элементы управления в рамках события кнопок «OnClick», я итерации через строки в GridView и используя следующий код для получения ссылки на элемент управления:
foreach (SPGridViewRow row in grid.Rows)
{
TextBox txtExamMark = (TextBox)row.FindControl("txtExamMark");
Вышеуказанное всегда ноль, а актерский состав не работает. Кто -нибудь может пролить свет на это? Я предполагаю, что это какая -то проблема ViewState, но я не уверен.
Я опубликовал еще несколько образцов кода ниже.
Спасибо,
Алекс
public class CustomSPGridViewTemplate : ITemplate
{
string columnName;
string controlType;
int controlWidth;
ListItemCollection itemColl;
string txtMode;
public CustomSPGridViewTemplate(string ctype,string colname,ListItemCollection itemcol,string mode,int cWidth)
{
columnName = colname;
controlType = ctype;
itemColl = itemcol;
controlWidth = cWidth;
txtMode = mode;
}
public void InstantiateIn(System.Web.UI.Control container)
{
if (controlType == "TextBox")
{
TextBox txtBox = new TextBox();
txtBox.ID = "txt" + columnName;
txtBox.Visible = true;
txtBox.Width = Unit.Pixel(controlWidth);
txtBox.DataBinding += new EventHandler(txtBox_DataBinding);
if (txtMode == "MultiLine")
{
txtBox.TextMode = TextBoxMode.MultiLine;
}
container.Controls.Add(txtBox);
}
if (controlType == "PupilImage")
{
Image pupilImage = new Image();
pupilImage.ID = "pupilImage";
pupilImage.Visible = true;
pupilImage.DataBinding += new EventHandler(pupilImage_DataBinding);
container.Controls.Add(pupilImage);
}
if (controlType == "DropDown")
{
DropDownList dropDown = new DropDownList();
dropDown.ID = "ddl" + columnName;
dropDown.Visible = true;
dropDown.DataBinding += new EventHandler(dropDown_DataBinding);
container.Controls.Add(dropDown);
}
}
void txtBox_DataBinding(object sender, EventArgs e)
{
TextBox txtBox = (TextBox)sender;
SPGridViewRow container = (SPGridViewRow)txtBox.NamingContainer;
txtBox.Text = DataBinder.Eval(container.DataItem, columnName).ToString();
}
Решение 2
Спасибо за ответы - в конце концов я нашел проблему.
Я переиздал колонны сетки в методе CreateChildControls, а также снова настраивал их в выборочном событии раскрывающегося списка.
Первоначально причина этого заключается в том, что к ней добавлены разные столбцы в зависимости от значения, выбранного в выпадении, но это не известно в событии CreateChildControls.
Настройка сетки, подобная этой дважды, заставила элементы управления каким -то образом исчезнуть из коллекции «Управление страницами», поэтому, когда я пытался отбрасывать их обратно, я всегда получал нуль.
Теперь я не настраиваю колонны сетки дважды, и это отлично работает - спасибо за вашу помощь!
Другие советы
Вы должны проверить тип DataRow, так как первая строка, наверное, будет строка заголовка, которую вы можете сделать, используя строку DataRow.
Некоторое время назад у нас была похожая проблема, кроме того, что подход к брошению на контроль - тот же подход, который я использовал во многих случаях.
Дайте мне знать, как вы поживаете.
С уважением Саймона
Я видел, как Spgridview ведут себя странно после отправков в одной из моих пользовательских веб -частей, например, рендеринговых рядов, но не рендеринг содержимого для ячеек в этих рядах.
Вы можете временно переписать его, чтобы просто использовать .NET GRIDVIEW вместо SPGRIDVIEW, и посмотреть, имеет ли это какое -либо значение. Если это также терпит неудачу, то, вероятно, где -то в вашем коде есть какая -то ошибка.