我最近通过给SQLite一个很好的索引来加速一个复杂的查询.这样的结果让我想知道是否应该索引常用于JOIN或ORDER BY子句的许多其他字段.但是我不想过度热心并让它适得其反:我认为必须有一些理由不创建索引,或者默认情况下每个字段都会被编入索引.
我在这种情况下使用SQLite,但当然也欢迎DBMS不可知的建议.
特别是我希望能够在运行时获得小(16 x 16)图标.
我试过这个:
new Icon(SystemIcons.Error, SystemInformation.SmallIconSize)
Run Code Online (Sandbox Code Playgroud)
据称"试图找到符合要求尺寸的图标版本",但它仍然给我一个32 x 32的图标.我也尝试过:
Size iconSize = SystemInformation.SmallIconSize;
Bitmap bitmap = new Bitmap(iconSize.Width, iconSize.Height);
using (Graphics g = Graphics.FromImage(bitmap))
{
g.DrawIcon(SystemIcons.Error, new Rectangle(Point.Empty, iconSize));
}
Run Code Online (Sandbox Code Playgroud)
但这只是将32 x 32图标缩小为丑陋的16 x 16.
我考虑过将图标从VS图像库中拉出来,但我真的希望它们随操作系统动态变化(XP上的XP图标,Vista上的Vista图标等).我愿意P/Invoke,如果这是它需要的.
我有一个子类,System.Windows.Forms.TreeView它手动"绑定"到一组分层数据.我希望用户能够编辑树的标签,并将更改反映回数据.所以我设置LabelEdit为true并覆盖OnAfterLabelEdit到:
protected override void OnAfterLabelEdit(NodeLabelEditEventArgs e)
{
base.OnAfterLabelEdit(e);
TreeNode node = e.Node;
if (PassesSomeValidation(e.Label))
{
MyDataNode dataNode = node.Tag as MyDataNode;
dataNode.SomeBoundValue = e.Label;
int oldIndex = node.Index;
int newIndex = RepositionChangedDataNode(dataNode);
TreeNode parent = node.Parent;
parent.Nodes.RemoveAt(oldIndex);
parent.Nodes.Insert(newIndex, node);
}
else
{
e.CancelEdit = true;
}
}
Run Code Online (Sandbox Code Playgroud)
RepositionChangedDataNode()重新排序数据并返回更改节点在排序后移动到的索引.我希望我可以简单地移动已编辑的节点以反映此移动.
问题是这会导致节点保持编辑模式!我试过调用EndEdit(),在插入节点之前克隆节点,设置LabelEdit为false并返回true,将更改包含在BeginUpdate()/中EndUpdate(),以及这些想法的各种组合,但它们都没有任何效果.
罪魁祸首似乎是插入.即使我尝试插入一个全新的节点,它也会立即进入编辑模式.
那么,有没有办法让TreeView这种方式表现得不那么好?如果没有,是否有一个很好的解决方法?
我考虑过的一些想法:
使用BeginInvoke()推移除嵌件的步骤返回到像这样的消息队列:
BeginInvoke(new MethodInvoker(delegate( …Run Code Online (Sandbox Code Playgroud)