Member 12697758 Ответов: 1

Удалить строки gridview (вложенные)


У меня есть вложенный Gridview, я реализовал поиск, и он изменил способ, которым я изначально располагал свой gridview. Теперь я сохраняю данные в dataTable, а затем привязываю их к gridview. У меня есть родительская таблица курсов, а под курсами находятся учебники, которые используются в этих курсах. Я получаю повторяющиеся строки в сетке моего родительского курса, потому что каждый раз, когда CourseID / Title отображается для книги, он генерирует повторяющуюся строку в моей родительской таблице курса, я на данный момент вне хорошей практики, поскольку мне нужно выполнить эту работу и просто хочу удалить любые повторяющиеся строки. Учебники добавляются и правильно вкладываются во вторую сетку. Я просто хочу удалить повторяющиеся строки в сетке моего курса.

скриншот домашней страницы 1 обеспечивает родительская таблица с повторяющимися строками

скриншот домашней страницы 2 обеспечивает правильную вложенность учебников по курсу

#1 https://gyazo.com/67a7aa39730dfb01443f565a966e8150[^]

#2 https://gyazo.com/462a75d9773fc39a1ea35bf160349cd6[^]

Примечание* если я нажму на значок " плюс "на любой дублирующейся строке, он откроет первый элемент всех дублирующихся строк и отобразит соответствующие данные, поэтому я думаю, что если я смогу найти способ реализовать" удалить дублирующуюся строку в таблице курса", то все будет в порядке.

Пожалуйста, дайте мне знать, если мне понадобится что-то еще.

namespace HUTDMS_V_2._0
{
    public partial class _Default : Page

    {

        

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!HttpContext.Current.User.Identity.IsAuthenticated)
            {
                
            }
            if (!Page.IsPostBack)
            {
                //i'm using a datatable for storing all the data 
                DataTable dTable = new DataTable();
               string query = "select  * from Course  inner join textBooks on textBooks.CourseID = Course.CourseID ";
               // string query = "select DISTINCT Course.CourseID, Course.CourseTitle, textBooks.* from textBooks inner join Course on Course.CourseID = textBooks.CourseID ";

                //wrapping in 'using' means the connection is closed an disposed when done 
                using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["HUTDMSConnectionString"].ToString()))
                using (SqlDataAdapter adapter = new SqlDataAdapter(query, connection))
                {
                    try
                    {
                        //fill the datatable with the contents from the database 
                        adapter.Fill(dTable);
                    }
                    catch
                    {
                    }
                }




                //save the datatable into a viewstate for later use 
                ViewState["allBooks"] = dTable;

                GridView1.DataSource = dTable;
                GridView1.DataBind();
            }


        }






        protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {

            if (e.Row.RowType == DataControlRowType.DataRow)
            {


               

                //always check if the viewstate exists before using it 
                if (ViewState["allBooks"] == null)
                    return;

                //cast the viewstate as a datatable 
                DataTable dt = ViewState["allBooks"] as DataTable;

                //find the nested grid and cast it 
                GridView gv = (GridView)e.Row.FindControl("GridView2");

                //get the CourseID from the main grid 
                DataRowView drv = e.Row.DataItem as DataRowView;
                string CourseID = (drv["CourseID"]).ToString();

                //filter the datatable with Linq to display only the one row needed and bind it to the nested grid 
               gv.DataSource = dt.AsEnumerable().Where(myRow => myRow.Field<string>("CourseID") == CourseID).CopyToDataTable();
               //gv.DataSource = dt.AsEnumerable().GroupBy(x => x.Field<string>("CourseID") == CourseID).Select(g => g.First()).CopyToDataTable();
                gv.DataBind();
            }


            



        }




        protected void SqlDataSource2_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e) 
        {
            string searchTerm = txtSearch.Text.ToLower();
            //check if the search input is at least 3 chars 
            if (searchTerm.Length >= 3)
            {
                //always check if the viewstate exists before using it 
                if (ViewState["allBooks"] == null)
                    return;

                //cast the viewstate as a datatable 
                DataTable dt = ViewState["allBooks"] as DataTable;

                //make a clone of the datatable 
                DataTable dtNew = dt.Clone();

                //search the datatable for the correct fields 
                foreach (DataRow row in dt.Rows)
                {
                    if (row["CourseID"].ToString().ToLower().Contains(searchTerm) || row["CourseTitle"].ToString().ToLower().Contains(searchTerm) || row["BookTitle"].ToString().ToLower().Contains(searchTerm) || row["thirteenISBN"].ToString().ToLower().Contains(searchTerm) || row["Notes"].ToString().ToLower().Contains(searchTerm))
                    {
                        //when found copy the row to the cloned table 
                        dtNew.Rows.Add(row.ItemArray);
                    }
                }

                //rebind the grid 
                GridView1.DataSource = dtNew;
                GridView1.DataBind();
            }

        }
        

        protected void btnReset_Click(object sender, EventArgs e)
        {
            //always check if the viewstate exists before using it 
            if (ViewState["allBooks"] == null)
                return;

            //cast the viewstate as a datatable 
            DataTable dt = ViewState["allBooks"] as DataTable;

            //rebind the grid 
            GridView1.DataSource = dt;
            GridView1.DataBind();
        }

        protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            //always check if the viewstate exists before using it 
            if (ViewState["allBooks"] == null)
                return;

            //cast the viewstate as a datatable 
            DataTable dt = ViewState["allBooks"] as DataTable;

            //rebind the grid 
            GridView1.PageIndex = e.NewPageIndex;
            GridView1.DataSource = dt;
            GridView1.DataBind();
        }

        protected void GridView1_DataBound(object sender, EventArgs e)
        {
           
        }
    }
    }


Что я уже пробовал:

Я пытался изменить свой запрос select, но безуспешно. Я пробовал реализовать все виды функций удаления дубликатов строк, которые я нашел, но я думаю, что здесь есть что-то уникальное, что можно сделать при условии моей проблемы.

1 Ответов

Рейтинг:
1

njammy

Привет
Простым решением для вас было бы перепроектировать привязку данных вашего gridview и его вложенных элементов более логично. Под этим я подразумеваю, возможно, более логичную подготовку данных.

Способ, которым я решил это раньше, заключается в выполнении запроса, который возвращает родительские данные строго только те столбцы, которые требуются для GridView1 (parent).

Затем выполните запрос данных для GridView2 (вложенный). Ваш существующий запрос в порядке, но я бы предложил использовать его только для данных GridView2 и избавиться от "SELECT*", так как это не делает вам никаких одолжений. Вместо этого измените select * на определенные обязательные столбцы GridView2.

При привязке вложенных строк вы можете легко сделать linq, например

var parentId = parentRow.Id;

ВАР gridView2Data =
из чайлдроу в чайлдроуз
присоединяйтесь к parentRow в parentrow
на childRow.Атрибутом parentId равен parentRow.Атрибутом parentId
где parentRow.Id == theParentId
выберите childRow

Есть смысл?

Надеюсь, это поможет.


Member 12697758

так будет ли я размещать это GridView1_RowDataBound?

njammy

Нет, вы можете сделать один запрос для дочерних данных при загрузке страницы или другой точки загрузки, а затем для данных строк, привязанных к дочернему gridview, найти данные из этих дочерних данных.

Если вы выполняете какой-либо запрос внутри RowDataBound, вы будете вызывать базу данных несколько раз, что может повредить производительности.