- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找一个可以与组合框一起使用组合框功能的选项
列表显示。
这样做的原因是因为我有不能超过1个输出的SQL查询,在某些情况下可以得到。
例如。我的SQL表看起来像这样Unique_ID - Name
123456789 - Simon
987654321 - Simon
基本上,同一名称可以多次出现在数据库中,每个条目都有自己的ID。
为了用户的缘故,我不能让他们根据ID选择要编辑的记录,而是让他们将所选记录基于名称。当查询产生的记录多于1条时,我得到一个MySQL异常。
这是有问题的MySQL查询:"SELECT worldspace from survivor where is_dead = '0' _ and survivor.unique_id = (select unique_id from profile where name = '" & target & "')"
然后,该查询的输出将在另一个UPDATE
查询中使用。
因此,对于我的组合框来说,是否有可能同时具有ID和名称作为值,并且它们之间有明显的分隔,从而使整个值保持良好的可读性,就像在listview元素中所做的那样?
最佳答案
我看到您已经对HighCore进行了处理,以了解WPF中所有内容的简易程度以及WinForms的消耗量。但是您可能想知道您也可以在WinForms中执行此操作。您只是做了一些不同的事情。毫无疑问,WinForms和WPF中的标准设计习惯有所不同。这并不能证明一个人比另一个人“更好”,这只是意味着您需要学习如何使用正在使用的那个人。 (尽管,诚然,使用20年前与Windows一起发明的UI框架,要实现一些更高级的东西要困难一些。它确实具有相当强大的功能。)
格式化信息的基本方法有两种:单行中的所有内容(我相信这是您在问题中所要的内容)或两行中的信息片段,其中每一项基本上都是两行单位(即HighCore的WPF解决方案演示)。
单行格式
简化方法
我们将首先将所有内容放在一行上,这确实很简单。您不需要分隔的列,将项目添加到组合框时,只需使用某种独特的分隔符即可,例如您使用的竖管(|
)或破折号(-
)问题。
这很好用,因为ComboBox.Items.Add
方法接受类型为Object
的参数,该方法只调用ToString
即可获取控件中显示的值。如果您传递一个字符串,它将显示该字符串。
myComboBox.BeginUpdate()
For Each record In myRecordSet
myComboBox.Items.Add(String.Format("{0} | {1}", record.UniqueID, record.Name))
' or even...
myComboBox.Items.Add(String.Format("{0} ({1})", record.UniqueID, record.Name))
Next record
myComboBox.EndUpdate()
Add
方法,以跟踪唯一的ID和名称属性(以及您想要的任何其他内容),并覆盖
ToString
方法以进行显示。
Public Class Record
Public Property UniqueID As Long ' maybe this should be a string too
Public Property Name As String
Public Overrides Function ToString() As String
' Generate the string that will be displayed in the combobox for this
' record, just like we did above when adding it directly to the combobox,
' except that in this case, it will be dynamically generated on the fly,
' allowing you to also track state information along with each item.
Return String.Format("{0} | {1}", Me.UniqueID, Me.Name)
End Function
End Class
' ...
' (somewhere else, when you add the items to the combobox:)
myComboBox.BeginUpdate()
For Each r In myRecordSet
' Create a Record object representing this item, and set its properties.
Dim newRecord As New Record
newRecord.UniqueID = r.UniqueID
newRecord.Name = r.Name
' ...etc.
' Then, add that object to the combobox.
myComboBox.Items.Add(newRecord)
Next r
myComboBox.EndUpdate()
DrawMode
属性设置为
OwnerDrawFixed
并处理
DrawItem
事件以手动绘制文本。您将使用
TextRenderer.DrawText
方法绘制标题字符串(因为
that matches what WinForms uses internally;避免使用
Graphics.DrawString
),并在必要时使用
TextRenderer.MeasureText
来获得正确的间距。绘图代码可以(并且应该)使用作为
DrawItemEventArgs
传递的
e
提供的所有默认属性。您不需要
OwnerDrawVariable
模式或处理
MeasureItem
事件,因为在这种情况下,每个项目的宽度和高度都不能改变。
Private Sub myComboBox_DrawItem(sender As Object, e As DrawItemEventArgs) Handles myComboBox.DrawItem
' Fill the background.
e.DrawBackground()
' Extract the Record object corresponding to the combobox item to be drawn.
Dim record As Record = DirectCast(myComboBox.Items(e.Index), Record)
Dim id As String = record.UniqueID.ToString()
Dim name As String = record.Name
' Calculate important positions based on the area of the drop-down box.
Dim xLeft As Integer = e.Bounds.Location.X
Dim xRight As Integer = xLeft + e.Bounds.Width
Dim xMid As Integer = (xRight - xLeft) / 2
Dim yTop As Integer = e.Bounds.Location.Y
Dim yBottom As Integer = yTop + e.Bounds.Height
' Draw the first (Unique ID) string in the first half.
TextRenderer.DrawText(e.Graphics, id, e.Font, New Point(xLeft, yTop), e.ForeColor)
' Draw the column separator line right down the middle.
e.Graphics.DrawLine(SystemPens.ButtonFace, xMid, yTop, xMid, yBottom)
' Draw the second (Name) string in the second half, adding a bit of padding.
TextRenderer.DrawText(e.Graphics, name, e.Font, New Point(xMid + 5, yTop), e.ForeColor, TextFormatFlags.Left)
' Finally, draw the focus rectangle.
e.DrawFocusRectangle()
End Sub
DrawItem
事件处理程序方法所使用的技术,但是只要组合框的大小适合将要显示的值,它就可以很好地工作。
OwnerDrawVariable
,因为项目的高度不会改变。您将始终有两行,因此固定高度可以正常工作。您只需要确保将
ItemHeight
属性设置为其正常值的两倍,因为您将有两行内容。您可以使用
TextRenderer.MeasureText
进行复杂的操作,也可以通过将默认值乘以2来实现简单的操作。我在本演示中选择了后者。
MultiLineComboBox
控件而不是内置的
System.Windows.Forms.ComboBox
。所有的属性和方法都相同。
Public Class MultiLineComboBox : Inherits ComboBox
Public Sub New()
' Call the base class.
MyBase.New()
' Typing a value into this combobox won't make sense, so make it impossible.
Me.DropDownStyle = ComboBoxStyle.DropDownList
' Set the height of each item to be twice its normal value
' (because we have two lines instead of one).
Me.ItemHeight *= 2
End Sub
Protected Overrides Sub OnDrawItem(e As DrawItemEventArgs)
' Call the base class.
MyBase.OnDrawItem(e)
' Fill the background.
e.DrawBackground()
' Extract the Record object corresponding to the combobox item to be drawn.
If (e.Index >= 0) Then
Dim record As Record = DirectCast(Me.Items(e.Index), Record)
' Format the item's caption string.
Dim caption As String = String.Format("ID: {0}{1}Name: {2}", record.UniqueID.ToString(), Environment.NewLine, record.Name)
' And then draw that string, left-aligned and vertically centered.
TextRenderer.DrawText(e.Graphics, caption, e.Font, e.Bounds, e.ForeColor, TextFormatFlags.Left Or TextFormatFlags.VerticalCenter)
End If
' Finally, draw the focus rectangle.
e.DrawFocusRectangle()
End Sub
End Class
OnDrawItem
中的绘图代码上花费更多的精力,我们可以添加一些额外的视觉效果和繁荣。
MultiLineComboBox
类中,您的其余代码甚至不必知道发生了什么特别的事情。酷吧?
关于vb.net - 每行有2个值的组合框有什么办法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15514698/
我的问题:非常具体。我正在尝试想出解析以下文本的最简单方法: ^^domain=domain_value^^version=version_value^^account_type=account_ty
好吧,这就是我的困境: 我正在为 Reddit 子版 block 开发常见问题解答机器人。我在 bool 逻辑方面遇到了麻烦,需要一双更有经验的眼睛(这是我在 Python 中的第一次冒险)。现在,该
它首先遍历所有 y 值,然后遍历所有 x 值。我需要 X 和 y 同时改变。 For x = 3 To lr + 1 For y = 2 To lr anyl.Cells(x, 1)
假设我有一个包含 2 列的 Excel 表格:单元格 A1 到 A10 中的日期和 B1 到 B10 中的值。 我想对五月日期的所有值求和。我有3种可能性: {=SUM((MONTH(A1:A10)=
如何转换 Z-score来自 Z-distribution (standard normal distribution, Gaussian distribution)到 p-value ?我还没有找到
我正在重写一些 Javascript 代码以在 Excel VBA 中工作。由于在这个网站上搜索,我已经设法翻译了几乎所有的 Javascript 代码!但是,有些代码我无法准确理解它在做什么。这是一
我遇到过包含日期格式的时间戳日期的情况。然后我想构建一个图表,显示“点击”项目的数量“每天”, //array declaration $array1 = array("Date" => 0); $a
我是scala的新手! 我的问题是,是否有包含成员的案例类 myItem:Option[String] 当我构造类时,我需要将字符串内容包装在: Option("some string") 要么 So
我正在用 PHP 创建一个登录系统。我需要用户使用他或她的用户名或电子邮件或电话号码登录然后使用密码。因为我知道在 Java 中我们会像 email==user^ username == user 这
我在 C++ 项目上使用 sqlite,但是当我在具有文本值的列上使用 WHERE 时出现问题 我创建了一个 sqlite 数据库: CREATE TABLE User( id INTEGER
当构造函数是显式时,它不用于隐式转换。在给定的代码片段中,构造函数被标记为 explicit。那为什么在 foo obj1(10.25); 情况下它可以工作,而在 foo obj2=10.25; 情况
我知道这是一个主观问题,所以如果需要关闭它,我深表歉意,但我觉得它经常出现,让我想知道是否普遍偏爱一种形式而不是另一种形式。 显然,最好的答案是“重构代码,这样你就不需要测试是否存在错误”,但有时没有
这两个 jQuery 选择器有什么区别? 以下是来自 w3schools.com 的定义: [attribute~=value] 选择器选择带有特定属性,其值包含特定字符串。 [attribute*=
为什么我们需要CSS [attribute|=value] Selector根本当 CSS3 [attribute*=value] Selector基本上完成相同的事情,浏览器兼容性几乎相似?是否存在
我正在解决 regx 问题。我已经有一个像这样的 regx [0-9]*([.][0-9]{2})。这是 amont 格式验证。现在,通过此验证,我想包括不应提供 0 金额。比如 10 是有效的,但
我正在研究计算机科学 A 考试的样题,但无法弄清楚为什么以下问题的正确答案是正确的。 考虑以下方法。 public static void mystery(List nums) { for (
好的,我正在编写一个 Perl 程序,它有一个我收集的值的哈希值(完全在一个完全独立的程序中)并提供给这个 Perl 脚本。这个散列是 (string,string) 的散列。 我想通过 3 种方式对
我有一个表数据如下,来自不同的表。仅当第三列具有值“债务”并且第一列(日期)具有最大值时,我才想从第四列中获取最大值。最终值基于 MAX(DATE) 而不是 MAX(PRICE)。所以用简单的语言来说
我有一个奇怪的情况,只有错误状态保存到数据库中。当“状态”应该为 true 时,我的查询仍然执行 false。 我有具有此功能的 Controller public function change_a
我有一个交易表(针对所需列进行了简化): id client_id value 1 1 200 2 2 150 3 1
我是一名优秀的程序员,十分优秀!