То, что у вас есть, это отношение один ко многим. Это можно реализовать с помощью ассоциаций Active Record https://guides.rubyonrails.org/association_basics.html .
Например, ваша таблица A может быть моделью Автор, а ваша таблица B может быть моделью Book
class Author < ApplicationRecord
has_many :books, dependent: :destroy
end
class Book < ApplicationRecord
belongs_to :author
end
Таким образом, ваш контроллер может искать ваших авторов
class CatalogController < ApplicationController
def list
@authors = Author.all
end
end
В вашем просмотр списка авторов и их книг (A.datecol как Author.name, B.description как Book.title)
<% @authors.each do |author| %>
- <%= author.name %>
<% author.books.each do |book| %>
- <%= book.title %>
<% end %>
<% end %>
Мы разделили управление DataGridView на подклассы и добавили это. Нам не была нужна перетащить/отбросить функциональность - мы просто должны были сказать пользователю, когда не было никаких данных, возвращенных из их запроса.
Нам объявили emptyText свойство как это:
private string cvstrEmptyText = "";
[Category("Custom")]
[Description("Displays a message in the DataGridView when no records are displayed in it.")]
[DefaultValue(typeof(string), "")]
public string EmptyText
{
get
{
return this.cvstrEmptyText;
}
set
{
this.cvstrEmptyText = value;
}
}
и перегруженный функция PaintBackground:
protected override void PaintBackground(Graphics graphics, Rectangle clipBounds, Rectangle gridBounds)
{
RectangleF ef;
base.PaintBackground(graphics, clipBounds, gridBounds);
if ((this.Enabled && (this.RowCount == 0)) && (this.EmptyText.Length > 0))
{
string emptyText = this.EmptyText;
ef = new RectangleF(4f, (float)(this.ColumnHeadersHeight + 4), (float)(this.Width - 8), (float)((this.Height - this.ColumnHeadersHeight) - 8));
graphics.DrawString(emptyText, this.Font, Brushes.LightGray, ef);
}
}
Я думаю, что самая легкая вещь сделать здесь состоит в том, чтобы сделать гигантский элемент управления "метка", чтобы сделать, "Перетаскивают Сюда" и обрабатывают маркировку, перетаскивают/отбрасывают событие. После того как перетаскивание/отбрасывание завершено, скройте маркировку и покажите сетку.
То, что я делаю в этой ситуации, добавляет управление вкладкой к форме, поместило DGV в одну вкладку, и маркировка ('Перетаскивают Сюда' или что-то подобное) на другой вкладке. Скройте вкладки. Затем, если DGV пуст, покажите вкладку с маркировкой. Точно так же, как ответ routeNpingme Вы обработали бы перетащить/отбросить событие здесь, загрузили бы DGV в фоновом режиме и затем переключили бы вкладки, когда это закончено, загрузившись. Это хорошо, потому что у Вас также есть способность легко переключиться назад и вперед между вкладками в то время как в Разработчике VS.
при использовании gridview вместо этого, можно использовать свойство EmptyDataText. Это может сделать все, что datagrid может, и (по моему скромному мнению) я думаю, что легче работать с в большинстве случаев