- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经在这个问题的帮助下在 FlowPanelLayout 中设置了 UserControls: For Each DataTable Add UserControl to FlowLayoutPanel
我现在正在尝试实现一个单击事件,它允许我在已选择的 UserControl 周围放置一个边框。我这样做了:
private void User_Load(object sender, EventArgs e)
{
flowlayoutpanelUsers.HorizontalScroll.Visible = false;
// Load and Sort Users DataTable
DataTable datatableUsers = UserMethods.GetUsers().Tables["Users"];
datatableUsers.DefaultView.Sort = "Name";
DataView dataviewUsers = datatableUsers.DefaultView;
// Loop Through Rows and Add UsersGrid to FlowLayoutPael
foreach (DataRowView datarowviewUsers in dataviewUsers)
{
var UsersGrid = new UsersGrid
{
Username = datarowviewUsers["Username"].ToString(),
User = datarowviewUsers["Name"].ToString(),
Admin = datarowviewUsers["Administrator"].ToString(),
};
flowlayoutpanelUsers.Controls.Add(UsersGrid);
UsersGrid.MouseClick += new MouseEventHandler(user_click);
}
}
private UsersGrid selectedUser;
void user_click(object sender, EventArgs e)
{
if (selectedUser != null)
selectedUser.BorderStyle = BorderStyle.None;
selectedUser = (UsersGrid)sender;
selectedUser.BorderStyle = BorderStyle.FixedSingle;
}
我的问题是,它仅在我单击 UserControl 中的空白区域时有效,但在用户单击两个标签或图像时无效。我如何让它也适用于所有子对象?
此外,我如何才能使用选定的 UserControl 执行其他操作,例如打开一个显示该选定用户的所有详细信息的表单?
最佳答案
我有一些建议给你。在我的回复底部,我包含了展示我的建议的代码。
建议 1:修复 UC 中的 MouseClick
当您为 UserControl (UC) 注册 MouseClick 事件时,您是在为 UserControl 本身这样做,而不是为您放置在 UserControl 上的任何控件(例如标签等)注册 MouseClick 事件。如果您单击这些子控件之一,则单击会成功不会被底层 UC“看到”。
要解决此问题,请为所有子控件注册 MouseClick 事件;您甚至可以为 UserControl 本身注册相同的 MouseClick 事件处理程序。
建议2:设置UC的BorderStyle
我会将您用于设置 UC 的 BorderStyle
的代码移至 UC 本身。创建在选择 UC 时设置为 true 的公共(public)属性 IsSelected
。在属性的 setter 中,根据属性的值更新 UC 的 BorderStyle
属性。
为您的 UC 公开一个 IsSelected
属性可能很方便:您可以查询一组这些 UC 以查看哪些被选中,而不是像通过表单那样尝试在控件之外跟踪此状态级变量。
根据您的评论进行编辑:
下面是一个示例,说明您可以如何查询 FlowLayoutPanel 中的 UC 以查看是否选择了任何 UC,如果找到了您可以如何采取一些行动。在这种情况下,操作是调用 EditUser
方法,该方法将您从所选 UC 中的属性中获取的值作为参数值:
var selectedUC = flowLayoutPanel.Controls.Cast<UserControl1>().FirstOrDefault(uc => uc.IsSelected);
if (selectedUC != null) {
// Use the properties of the UC found to be selected as parameters is method EditUser.
EditUser(selectedUC.Name, selectedUC.Username, selectedUC.Administrator);
}
建议 3:管理一组 UC 的选择
如果您想取消选择组中除用户单击(即选择)之外的所有 UC,您需要在您的 UC 中创建一个事件,该事件在单击 UC 时触发。此事件的处理程序显式地将集合中所有 UC 的 IsSelected
设置为 false(例如在容器类型控件中,例如 Form、FlowLayoutPanel 等),UC 中的 MouseClick 处理程序是点击后会将被点击的 UC 的 IsSelected
设置为 true。
值得考虑创建另一种 UserControl 类型来管理一组 UC。这个新的 UserControl 可以封装用于创建和管理您的 UC 集的代码,并有助于在其他项目中使用您的 UC,并使托管您的 UC 的表单代码更加简洁。
我想与其为我的每条建议包含一系列不连贯的代码片段,不如包含我希望的最少代码量,让您能够重现我正在谈论的内容。
创建一个新的 Visual Studio Winform 项目并为 Form1
类使用以下内容:
public partial class Form1 : Form
{
public Form1() {
InitializeComponent();
flowLayoutPanel = new FlowLayoutPanel {
Dock = DockStyle.Fill,
};
this.Controls.Add(flowLayoutPanel);
// Add several sample UCs.
for (int i = 0; i < 10; i++) {
var uc = new UserControl1();
uc.WasClicked += UsersGrid_WasClicked;
flowLayoutPanel.Controls.Add(uc);
}
}
FlowLayoutPanel flowLayoutPanel;
// Event handler for when MouseClick is raised in a UserControl.
void UsersGrid_WasClicked(object sender, EventArgs e) {
// Set IsSelected for all UCs in the FlowLayoutPanel to false.
foreach (Control c in flowLayoutPanel.Controls) {
if (c is UserControl1) {
((UserControl1)c).IsSelected = false;
}
}
}
}
接下来向项目中添加一个UserControl。保留名称 UserControl1
并添加几个 Labels 和一个 PictureBox。将此代码用于类 UserControl1
:
public partial class UserControl1 : UserControl
{
public UserControl1() {
InitializeComponent();
this.Load += UsersGrid_Load;
}
// Event fires when the MouseClick event fires for the UC or any of its child controls.
public event EventHandler<EventArgs> WasClicked;
private void UsersGrid_Load(object sender, EventArgs e) {
// Register the MouseClick event with the UC's surface.
this.MouseClick += Control_MouseClick;
// Register MouseClick with all child controls.
foreach (Control control in Controls) {
control.MouseClick += Control_MouseClick;
}
}
private void Control_MouseClick(object sender, MouseEventArgs e) {
var wasClicked = WasClicked;
if (wasClicked != null) {
WasClicked(this, EventArgs.Empty);
}
// Select this UC on click.
IsSelected = true;
}
private bool _isSelected;
public bool IsSelected {
get { return _isSelected; }
set {
_isSelected = value;
this.BorderStyle = IsSelected ? BorderStyle.Fixed3D : BorderStyle.None;
}
}
}
关于c# - 从 FlowLayoutPanel 选择 UserControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12608300/
您好,我的 WPF UserControl 知识只有一个小时了。因此,如果有很多关于这个问题的教程或/和答案,请原谅我(老实说,我认为这无法完成,需要重新编写代码……因此我想问的原因) 因此,在创建
我看过几篇文章介绍如何删除在运行时添加的 UserControl,但我的问题有点不同。我有一个 UserControl,它由一个图像组成,右上角有一个小“x”按钮,用于从其父 Canvas 中删除自身
我有一个用户控件 UserControl1,它在其资源中定义了一种样式。该用户控件包含一个 UserControl2 实例,它引用了该样式:
我正在尝试以 How can a WPF UserControl inherit a WPF UserControl? 中提到的方式继承 WPF 中的用户控件 namespace DMS.Presen
我想创建几个具有一些通用功能的 WPF UserControl 类。出于这个原因,我想从一个新的基类派生类,而这个基类又派生自 UserControl。 我的问题是我的 C# 类是 部分 定义的,而自
这个问题在这里已经有了答案: Should a user control have its own view model? (6 个答案) How to correctly bind to a de
我有一个 UserControl,它包含另一个带有 Button 的 UserControl。我想在第一个 UserControl(父级)中向该按钮添加一个事件。我尝试这样做: void Page_I
我需要我所有的用户控件都具有一些类似的功能。所以我的用户控件是: using System.Windows.Controls; namespace WpfApplication26 { ///
以下 WPF UserControl 调用了 DataTypeWholeNumber,它有效。 现在我想创建一个名为 DataTypeDateTime 和 DataTypeEmail 等的 UserC
我有一个包含按钮和其他一些控件的 UserControl: ... 当我创建该控件的新实例时,我想获取 Button 的 Command 属性: 当然,“Th
我不确定这个问题是否已经发布,并且我已经检查了建议的 SO 链接,但似乎没有一个链接与该问题完全相关。因此,如果有人认为这可能是重复的,请发布建议答案的链接并原谅这篇文章。 解决我的问题的方法可能不止
我在 UserControl_1 中有两个 UserControl,有一个按钮可以在 MainWindow.axml 中的 StackPanel 中添加 UserControl_2。我在 UserCo
我正在开发一个由多个传感器组成的模块化项目,每个传感器都继承自一个抽象的 Sensor 类。为了配置每个传感器,我已经开始为每个传感器添加一个用户控制面板(继承自 UserControl),它在运行时
我正在使用 c#.net 我的网络表单中有不同的 View ,除了三个文本框(到达/看到/离开时间)之外,这些通常都显示不同的信息。为了尝试减少代码,我创建了一个包含这三个文本框的 UserContr
我有一个 UserControl,它有两个组件 public System.Windows.Forms.ComboBox innerComboBox; public System.Windows.Fo
我有一个包含 ListBox 的 userControl。我想从另一个 userControl 访问那个 ListBox。 例如: UserControl1.ListBox1.Items.Count;
我在更新另一个用户控件中的用户控件时遇到问题。 示例代码: UserControl MyCart1 = (UserControl)Page.FindControl("MyCart1"); Update
我在下面添加了一些屏幕截图和重现步骤。 我的数据模型有一个基类,我们称它为 CommonThing,它有很多属性。然后有几个具有附加属性的此类的特殊版本。我现在想创建一个 UI 来将数据输入到这个模型
我有一个应用程序,我需要确保在使用 ShowDialog() 单击用户控件上的按钮打开的表单将在我处理用户控件时关闭和处理。 我通过计时器在主窗体中调用 userControl.Dispose()。
我正在努力实现... 用户控件(MyRepeater) Control Start Control End 页面 Page Start Page Item Tem
我是一名优秀的程序员,十分优秀!