У меня есть проблема с чтением элемента управления шаблоном gridview, где количество столбцов является переменным в gridview . Найти метод управления дает ошибку
У меня есть требование сделать табличную структуру с помощью gridview, количество столбцов которой является переменным. Я создал сетку, добавив в нее поле шаблона и элементы управления ярлыком/выпадающим списком, а также привязку к данным, поступающим из базы данных . У меня есть кнопка сохранения вне gridview, на которой событие click я должен сохранить данные, найдя элементы управления внутри gridview, а также найти элемент управления lable в выпадающем списке selectected event change. Но он выдает ошибку "найдено несколько элементов управления с одинаковым идентификатором 'Lbl_SUBJECT_ID'. FindControl требует, чтобы элементы управления имели уникальные идентификаторы."
Пожалуйста, помогите мне . Я даю код страницы здесь .
Что я уже пробовал:
Вот код страницы Test.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="WebApplication1.Test" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:GridView ID="GridView1" runat="server" CellPadding="0" AutoGenerateColumns="false" OnRowCreated="GridView1_RowCreated" OnRowDataBound="GridView1_RowDataBound"> <Columns> </Columns> </asp:GridView> </div> <div> <asp:Button ID="Button1" runat="server" Text="Save" OnClick="Button1_Click" /> </div> </form> </body> </html>
Here is Test.aspx.cs Page code
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; namespace WebApplication1 { public partial class Test : System.Web.UI.Page { bool flagGenerateGrid = true; protected void Page_Init(object sender, EventArgs e) { //---------------------------------------------------------------------------------------------------// DataTable dtSubject = new DataTable("Subject"); DataColumn dcSubject; DataRow drSubject; // Create SUBJECT_ID Column dcSubject = new DataColumn(); dcSubject.DataType = System.Type.GetType("System.Int32"); dcSubject.ColumnName = "SUBJECT_ID"; dcSubject.Caption = "SUBJECT_ID"; dcSubject.ReadOnly = false; dtSubject.Columns.Add(dcSubject); // Create SUBJECT_NAME Column dcSubject = new DataColumn(); dcSubject.DataType = System.Type.GetType("System.String"); dcSubject.ColumnName = "SUBJECT_NAME"; dcSubject.Caption = "SUBJECT_NAME"; dcSubject.ReadOnly = false; dtSubject.Columns.Add(dcSubject); dtSubject.Rows.Add(1, "Hindi"); dtSubject.Rows.Add(2, "English"); dtSubject.Rows.Add(3, "Mathematics"); dtSubject.Rows.Add(4, "Physics"); dtSubject.Rows.Add(5, "Chemistry"); dtSubject.Rows.Add(6, "Biology"); //---------------------------------------------------------------------------------------------------// DataTable dtClass = new DataTable("Subject"); DataColumn dcClass; DataRow drClass; // Create CLASS_ID Column dcClass = new DataColumn(); dcClass.DataType = System.Type.GetType("System.Int32"); dcClass.ColumnName = "CLASS_ID"; dcClass.Caption = "CLASS_ID"; dcClass.ReadOnly = false; dtClass.Columns.Add(dcClass); // Create CLASS_NAME Column dcClass = new DataColumn(); dcClass.DataType = System.Type.GetType("System.String"); dcClass.ColumnName = "CLASS_NAME"; dcClass.Caption = "CLASS_NAME"; dcClass.ReadOnly = false; dtClass.Columns.Add(dcClass); dtClass.Rows.Add(0, "LKG"); dtClass.Rows.Add(1, "CLASS I"); dtClass.Rows.Add(2, "CLASS II"); dtClass.Rows.Add(3, "CLASS III"); dtClass.Rows.Add(4, "CLASS IV"); dtClass.Rows.Add(5, "CLASS V"); dtClass.Rows.Add(6, "CLASS VI"); dtClass.Rows.Add(7, "CLASS VII"); dtClass.Rows.Add(8, "CLASS VIII"); //---------------------------------------------------------------------------------------------------// CreateGridView(dtSubject); GridView1.DataSource = CreateDatatable(dtSubject, dtClass); GridView1.DataBind(); } protected void Page_Load(object sender, EventArgs e) { } protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e) { } protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (flagGenerateGrid) { if (e.Row.RowType == DataControlRowType.DataRow) { DataTable dt = new DataTable(); dt = (DataTable)ViewState["dt"]; DataTable dtProduct = new DataTable(); int counter = Convert.ToInt32(dt.Columns.Count); Label LblClass = new Label(); LblClass.ID = "LblClassName"; LblClass.Text = (e.Row.DataItem as DataRowView).Row[0].ToString(); e.Row.Cells[0].Controls.Add(LblClass); for (int column = 1; column < counter; column++) { string clubId = (e.Row.DataItem as DataRowView).Row[column].ToString(); string[] arrayId = clubId.Split(','); int classId = Convert.ToInt32(arrayId[0]); int subjectId = Convert.ToInt32(arrayId[1]); Label LblClassId = new Label(); LblClassId.ID = "Lbl_SUBJECT_ID"; LblClassId.Text = Convert.ToString(classId); e.Row.Cells[column].Controls.Add(LblClassId); Label LblSubjectId = new Label(); LblSubjectId.ID = "Lbl_SUBJECT_ID"; LblSubjectId.Text = Convert.ToString(subjectId); e.Row.Cells[column].Controls.Add(LblSubjectId); DropDownList DdlTeacher = new DropDownList(); DdlTeacher.ID = "DdlTeacherId"; DdlTeacher.AppendDataBoundItems = true; DdlTeacher.AutoPostBack = true; DdlTeacher.DataTextField = "TEACHER_NAME"; DdlTeacher.DataValueField = "TEACHER_ID"; DdlTeacher.DataSource = null; DdlTeacher.DataBind(); //---------------------------------------------------------------------------------------------------// DataTable dtTeacher = new DataTable("Subject"); DataColumn dcTeacher; // Create SUBJECT_ID Column dcTeacher = new DataColumn(); dcTeacher.DataType = System.Type.GetType("System.Int32"); dcTeacher.ColumnName = "TEACHER_ID"; dcTeacher.Caption = "TEACHER_ID"; dcTeacher.ReadOnly = false; dtTeacher.Columns.Add(dcTeacher); // Create SUBJECT_NAME Column dcTeacher = new DataColumn(); dcTeacher.DataType = System.Type.GetType("System.String"); dcTeacher.ColumnName = "TEACHER_NAME"; dcTeacher.Caption = "TEACHER_NAME"; dcTeacher.ReadOnly = false; dtTeacher.Columns.Add(dcTeacher); dtTeacher.Rows.Add(1, "Teacher1"); dtTeacher.Rows.Add(2, "Teacher2"); dtTeacher.Rows.Add(3, "Teacher3"); dtTeacher.Rows.Add(4, "Teacher4"); dtTeacher.Rows.Add(5, "Teacher5"); //---------------------------------------------------------------------------------------------------// DdlTeacher.DataSource = dtTeacher; DdlTeacher.DataBind(); DdlTeacher.SelectedIndexChanged += DdlTeacherId_SelectedIndexChanged; e.Row.Cells[column].Controls.Add(DdlTeacher); } } } } protected void DdlTeacherId_SelectedIndexChanged(object sender, EventArgs e) { //---- --Here I am trying to find the subjedctId,classId & teacherId but It is giving error----------- DropDownList DdlTeacherId = (DropDownList)sender; GridViewRow row = (GridViewRow)DdlTeacherId.NamingContainer; Label Lbl_SUBJECT_ID = row.FindControl("Lbl_SUBJECT_ID") as Label; int subjectId = Convert.ToInt32(Lbl_SUBJECT_ID.Text); DropDownList ddl = row.FindControl("DdlTeacherId") as DropDownList; int teacherId = Convert.ToInt32(ddl.SelectedValue); Label Lbl_CLASS_ID = row.FindControl("Lbl_CLASS_ID") as Label; int classId = Convert.ToInt32(Lbl_CLASS_ID.Text); //-------------------------------------------------------------------- } protected void CreateGridView(DataTable dtSubject) { TemplateField field = new TemplateField(); PlaceHolder ph = new PlaceHolder(); field.HeaderText = "Class"; GridView1.Columns.Add(field); foreach (DataRow dr in dtSubject.Rows) { TemplateField tfield = new TemplateField(); tfield.HeaderText = Convert.ToString(dr["SUBJECT_NAME"]); GridView1.Columns.Add(tfield); } } protected DataTable CreateDatatable(DataTable dtSubject, DataTable dtClass) { try { DataTable dt = new DataTable(); dt.Columns.Add("Class", typeof(System.String)); foreach (DataRow dr in dtSubject.Rows) { dt.Columns.Add(Convert.ToString(dr["SUBJECT_NAME"]), typeof(System.String)); } DataRow DataRowNew; for (int row = 0; row < dtClass.Rows.Count; row++) { DataRowNew = dt.NewRow(); DataRowNew["Class"] = Convert.ToString(dtClass.Rows[row]["CLASS_NAME"]); for (int column = 0; column < dtSubject.Rows.Count; column++) { DataRowNew[Convert.ToString(dtSubject.Rows[column]["SUBJECT_NAME"])] = Convert.ToString(dtClass.Rows[row][0]) + "," + Convert.ToString(dtSubject.Rows[column]["SUBJECT_ID"]); } dt.Rows.Add(DataRowNew); } ViewState["dt"] = dt; return dt; } catch (Exception ex) { throw ex; } } protected void Button1_Click(object sender, EventArgs e) { DataTable dt = new DataTable(); DataColumn dtColumn; // Create CLASS_ID Column dtColumn = new DataColumn(); dtColumn.DataType = System.Type.GetType("System.Int32"); dtColumn.ColumnName = "CLASS_ID"; dtColumn.Caption = "CLASS_ID"; dtColumn.ReadOnly = false; dt.Columns.Add(dtColumn); // Create SUBJECT_ID Column dtColumn = new DataColumn(); dtColumn.DataType = System.Type.GetType("System.Int32"); dtColumn.ColumnName = "SUBJECT_ID"; dtColumn.Caption = "SUBJECT_ID"; dtColumn.ReadOnly = false; dt.Columns.Add(dtColumn); // Create TEACHER_ID Column dtColumn = new DataColumn(); dtColumn.DataType = System.Type.GetType("System.Int32"); dtColumn.ColumnName = "TEACHER_ID"; dtColumn.Caption = "TEACHER_ID"; dtColumn.ReadOnly = false; dt.Columns.Add(dtColumn); for (int rows = 1; rows < GridView1.Rows.Count; rows++) { for (int column = 1; column < GridView1.Rows.Count; column++) { //-------------Here I want to save data by finding controls--------------------------- DropDownList DdlTeacherId = (DropDownList)GridView1.Rows[rows].Cells[column].FindControl("DdlTeacherId"); int teacherId = Convert.ToInt32(DdlTeacherId.SelectedValue); Label Lbl_SUBJECT_ID = (Label)GridView1.Rows[rows].Cells[column].FindControl("Lbl_SUBJECT_ID"); int subjectId = Convert.ToInt32(Lbl_SUBJECT_ID.Text); Label Lbl_CLASS_ID = (Label)GridView1.Rows[rows].Cells[column].FindControl("Lbl_CLASS_ID"); int classId = Convert.ToInt32(Lbl_CLASS_ID.Text); dt.Rows.Add(classId,subjectId,teacherId); // Above I just want to save this data table in but failed to find controls on save button click event } } } } }
Richard MacCutchan
Сообщение совершенно ясно, вы не можете использовать FindControl, когда элементы управления имеют один и тот же идентификатор. Как код решает, какой из них вам нужен?
Raj_1984
Затем как считывать управляющие данные при нажатии кнопки Сохранить событие. предложить мне.
Afzaal Ahmad Zeeshan
Ответьте на их комментарий, чтобы уведомить их.