gpt4 book ai didi

C# objectlistview 在单元格编辑器中 undefined offset

转载 作者:太空宇宙 更新时间:2023-11-03 23:05:28 30 4
gpt4 key购买 nike

我使用 ObjectListView 库中的 TreeListView 组件。我将单元格值设置为可编辑,当我双击它们时,TextBox 将以奇数偏移量出现。我想删除这个偏移量,但是如何呢?

开始编辑之前 enter image description here

开始编辑后 enter image description here

如您所见,第一行第二列(“我的新设备”)TextBox 出现了偏移。

附言编辑工作按预期进行。只有偏移让我很烦

附言如您所见,偏移量取决于第一列偏移量。我如何将其更改为零? enter image description here

最佳答案

经过长时间的搜索,我找到了解决方案!

OLV源码,ObjectListView.cs

public virtual void StartCellEdit(OLVListItem item, int subItemIndex) {
OLVColumn column = this.GetColumn(subItemIndex);
Control c = this.GetCellEditor(item, subItemIndex);
Rectangle cellBounds = this.CalculateCellBounds(item, subItemIndex);
c.Bounds = this.CalculateCellEditorBounds(item, subItemIndex, c.PreferredSize);

// Try to align the control as the column is aligned. Not all controls support this property
Munger.PutProperty(c, "TextAlign", column.TextAlign);

// Give the control the value from the model
this.SetControlValue(c, column.GetValue(item.RowObject), column.GetStringValue(item.RowObject));

// Give the outside world the chance to munge with the process
this.CellEditEventArgs = new CellEditEventArgs(column, c, cellBounds, item, subItemIndex);
this.OnCellEditStarting(this.CellEditEventArgs);
if (this.CellEditEventArgs.Cancel)
return;

// The event handler may have completely changed the control, so we need to remember it
this.cellEditor = this.CellEditEventArgs.Control;

this.Invalidate();
this.Controls.Add(this.cellEditor);
this.ConfigureControl();
this.PauseAnimations(true);
}

我看到 CellEditEventArgs 包含 Control,它绘制在名为 Bounds 的区域中。

源文件中的这个函数将偏移量附加到控件的边界:

protected Rectangle CalculateCellEditorBoundsStandard(OLVListItem item, int subItemIndex, Rectangle cellBounds, Size preferredSize) {
if (this.View == View.Tile)
return cellBounds;

// Center the editor vertically
if (cellBounds.Height != preferredSize.Height)
cellBounds.Y += (cellBounds.Height - preferredSize.Height) / 2;

// Only Details view needs more processing
if (this.View != View.Details)
return cellBounds;

// Allow for image (if there is one).
int offset = 0;
object imageSelector = null;
if (subItemIndex == 0)
imageSelector = item.ImageSelector;
else {
// We only check for subitem images if we are owner drawn or showing subitem images
if (this.OwnerDraw || this.ShowImagesOnSubItems)
imageSelector = item.GetSubItem(subItemIndex).ImageSelector;
}
if (this.GetActualImageIndex(imageSelector) != -1) {
offset += this.SmallImageSize.Width + 2;
}

// Allow for checkbox
if (this.CheckBoxes && this.StateImageList != null && subItemIndex == 0) {
offset += this.StateImageList.ImageSize.Width + 2;
}

// Allow for indent (first column only)
if (subItemIndex == 0 && item.IndentCount > 0) {
offset += (this.SmallImageSize.Width * item.IndentCount);
}

// Do the adjustment
if (offset > 0) {
cellBounds.X += offset;
cellBounds.Width -= offset;
}

return cellBounds;
}

我们可以看到,偏移量附加到每个单元格(不仅是第一个)。我们还可以看到,CellEditEventArgs 包含 CellBounds

所以我们可以将 Control.Bounds 重置为 CellBounds 值:

//...
dataTreeView.CellEditStarting += DisableInputValueForCollections;
//...
private static void DisableInputValueForCollections(object sender, CellEditEventArgs e)
{
RemoveExtraOffsetForNotFirstColumnInputControl(e);
var node = e.RowObject as DataTreeNode;

if (node != null && e.Column.AspectName == "Value")
{
if (node.IsContainer()) e.Cancel = true;
}
}
//...
private static void RemoveExtraOffsetForNotFirstColumnInputControl(CellEditEventArgs e)
{
if (e.Column.AspectName != "Name")
{
e.Control.Bounds = e.CellBounds;
}
}
//...

关于C# objectlistview 在单元格编辑器中 undefined offset ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41363661/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com