Как включить прокрутку панели макета потока в приложении Windows Forms?C#

Место общения программистов C#
Ответить
Anonymous
 Как включить прокрутку панели макета потока в приложении Windows Forms?

Сообщение Anonymous »

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

Код: Выделить всё

using LibraryDatabaseApp.Properties;
using Microsoft.VisualBasic.ApplicationServices;
using Mysqlx.Crud;
using System.Security.Cryptography.X509Certificates;
using System.Windows.Forms;
using static System.Reflection.Metadata.BlobBuilder;

namespace LibraryDatabaseApp
{
public partial class Form1 : Form
{
BindingSource bookBindingSource = new BindingSource();
private Main_Form mainForm;
public int bookCount = 24;

public Form1(Main_Form mainForm)
{
InitializeComponent();
this.mainForm = mainForm;
this.KeyPreview = true;
this.KeyDown += Form1_KeyDown;

// Enable FlowLayoutPanel scrolling
flowLayoutPanel1.AutoScroll = true;

// Attach event handlers
flowLayoutPanel1.Scroll += FlowLayoutPanel1_Scroll;
VScrollBar1.Scroll += VScrollBar1_Scroll;

// Initialize scrollbar state
UpdateScrollBar();
}

private void UpdateScrollBar()
{
// Get the total content height and the visible height
int contentHeight = flowLayoutPanel1.DisplayRectangle.Height;
int visibleHeight = flowLayoutPanel1.ClientSize.Height;

if (contentHeight > visibleHeight) // If content is larger than the visible area
{
VScrollBar1.Enabled = true;

// Configure scrollbar properties
VScrollBar1.Minimum = 0;
VScrollBar1.Maximum = contentHeight - visibleHeight;
VScrollBar1.LargeChange = visibleHeight;
VScrollBar1.SmallChange = 20;

// Synchronize scrollbar with FlowLayoutPanel scroll position
SafeSetScrollBarValue(VScrollBar1, -flowLayoutPanel1.AutoScrollPosition.Y);
}
else
{
VScrollBar1.Enabled = false; // Disable scrollbar if no scrolling is required
}
}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
button2_Click(sender, e);
}
}

private Panel CreateBookPanel(Book book)
{
Panel bookPanel = new Panel
{
Width = 200,
Height = 250,
Margin = new Padding(10),
BorderStyle = BorderStyle.FixedSingle,
Tag = book // Store the book object for easy retrieval
};

bookPanel.Click += BookPanel_Click;

PictureBox coverPictureBox = new PictureBox
{
Width = 180,
Height = 120,
SizeMode = PictureBoxSizeMode.Zoom,
Dock = DockStyle.Top,
};
coverPictureBox.Load(book.ImageURL);
coverPictureBox.Click += BookPanel_Click;

Label titleLabel = new Label
{
Text = book.BookName,
AutoSize = false,
Width = bookPanel.Width,
Height = 40,
TextAlign = ContentAlignment.MiddleCenter,
Dock = DockStyle.Top
};
titleLabel.Click += BookPanel_Click;

Label authorLabel = new Label
{
Text = "Author: " + book.AuthorName,
AutoSize = false,
Width = bookPanel.Width,
Height = 20,
TextAlign = ContentAlignment.MiddleCenter,
Dock = DockStyle.Top
};
authorLabel.Click += BookPanel_Click;

bookPanel.Controls.Add(coverPictureBox);
bookPanel.Controls.Add(titleLabel);
bookPanel.Controls.Add(authorLabel);

return bookPanel;
}

private void BookPanel_Click(object sender, EventArgs e)
{
Panel clickedPanel = sender as Panel;
if (clickedPanel == null && sender is Control control && control.Parent is Panel parentPanel)
{
clickedPanel = parentPanel;
}

if (clickedPanel != null &&  clickedPanel.Tag is Book selectedBook)
{
BookForm bookForm = new BookForm(
mainForm,
selectedBook.BookName,
selectedBook.AuthorName,
selectedBook.Year.ToString(),
selectedBook.ImageURL,
selectedBook.ISBN,
selectedBook.Description,
selectedBook.Language
);

mainForm.LoadForm(bookForm);
}
}

private void button1_Click(object sender, EventArgs e)
{
BooksDAO booksDAO = new BooksDAO();
List books = booksDAO.getAllBooks();

flowLayoutPanel1.Controls.Clear();

foreach (var book in books)
{
Panel bookPanel = CreateBookPanel(book);
flowLayoutPanel1.Controls.Add(bookPanel);
}

UpdateScrollBar(); // Update scrollbar after content changes
}

private void button2_Click(object sender, EventArgs e)
{
BooksDAO booksDAO = new BooksDAO();
string searchTerm = textBox1.Text;
List searchResults = booksDAO.searchBooks(searchTerm);

flowLayoutPanel1.Controls.Clear();

foreach (var book in searchResults)
{
Panel bookPanel = CreateBookPanel(book);
flowLayoutPanel1.Controls.Add(bookPanel);
}

if (searchResults.Count == 0)
{
MessageBox.Show("No books found for the search term: " + searchTerm);
}

UpdateScrollBar(); // Update scrollbar after content changes
}

private void button3_Click(object sender, EventArgs e)
{
mainForm.LoadForm(new MenuForm(mainForm));
}

private void pictureBox1_Click(object sender, EventArgs e)
{
mainForm.LoadForm(new MenuForm(mainForm));
}

private void pictureBox2_Click(object sender, EventArgs e)
{
mainForm.LoadForm(new MenuForm(mainForm));
}

private void FlowLayoutPanel1_Scroll(object sender, ScrollEventArgs e)
{
SafeSetScrollBarValue(VScrollBar1, -flowLayoutPanel1.AutoScrollPosition.Y);
}

private void VScrollBar1_Scroll(object sender, ScrollEventArgs e)
{
flowLayoutPanel1.AutoScrollPosition = new Point(0, VScrollBar1.Value);
}

private void SafeSetScrollBarValue(VScrollBar scrollBar, int value)
{
if (scrollBar.Value != value)
{
if (value < scrollBar.Minimum)
scrollBar.Value = scrollBar.Minimum;
else if (value > scrollBar.Maximum)
scrollBar.Value = scrollBar.Maximum;
else
scrollBar.Value = value;
}
}
}
}
Графический дизайн формы 1
Я попробовал чат gpt, но получилось только хуже. Я нашел несколько простых решений на YouTube, но они ничего не сделали. Может кто-нибудь проверить мой код, пожалуйста, я в отчаянии.

Подробнее здесь: https://stackoverflow.com/questions/792 ... -forms-app
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»