Raj_1984 Ответов: 1

У меня есть проблема с чтением элемента управления шаблоном 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

Ответьте на их комментарий, чтобы уведомить их.

1 Ответов

Рейтинг:
1

Gerry Schmitz

У вас есть цикл FOR, и вы продолжаете назначать один и тот же идентификатор. Вам нужно изменить идентификатор.

LblClassId.ID = "Lbl_SUBJECT_ID";


против

LblClassId.ID = $"Lbl_SUBJECT_ID_{column:d2}";