Удалить строки 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, но безуспешно. Я пробовал реализовать все виды функций удаления дубликатов строк, которые я нашел, но я думаю, что здесь есть что-то уникальное, что можно сделать при условии моей проблемы.