繁体   English   中英

如何使用C#VSTO处理Excel中范围事件的鼠标移动

[英]How to handle mouse moving of ranges event in Excel using C# VSTO

简介:我有一个类,它用相似的逻辑表示表列:

class ColumnWrapper
{
    int _column;
    int _row;
    string _name;
    string _caption;
    Worksheet _worksheet;

    Dictionary<int, string> _values; // <row offset index, value>

    public void Open()
    {
        // ...
        // Connect to server and get values
        // ...

        Range r = _worksheet.Range[_column, _row];
        r.Value2 = _caption;

        foreach (Range item in _values)
        {
            Range r = _worksheet.Range[_column, _row + item.Key];
            r.Value2 = item.Value;
        }

        var addressStart = String.Concat(ExcelColumnFromNumber(_column), _row);
        var addressEnd = String.Concat(ExcelColumnFromNumber(_column), (_row + _values.Keys.Max()));

        Range range = _worksheet.Range[addressStart, addressEnd];
        _worksheet.Names.Add(_name, )
    }

    public void Delete(string value)
    {
        // Delete row and shift all rows below to up
        int index = _values.First(i => i.Value == value).Key;

        foreach(var key in _values.Where(i => i.Key > index))
            // decrement index

        RefreshValues();
    }
}

Excel中的用户可以选择某个范围,然后将其移动到某个地方。

在此处输入图片说明

我需要处理此事件,因为要允许用户仅移动标题单元格,并在所有其他情况下放弃移动。

次要问题:如何以编程方式移动范围? 现在,在删除行时,我将进行_values收集并递减所有索引,该索引大于已删除值的索引。 之后,我将所有范围的值重置,它是如此之慢。 但是,如果可以移动范围,则速度会更快。

没有开箱即用的此类事件。 您可以通过使用一些其他逻辑来模拟许多事件。 我认为您可以使用以下逻辑来实现所需的事件:

  1. 订阅选择更改事件。
  2. 在事件处理程序中,您应该跟踪上一个选定的范围。 您将其与当前选定的比较。 如果范围值相同,但仅位置更改,则发生移动。 然后,您可以执行逻辑以确定是否仅移动了标题。 如果不是,则将移动恢复到原始位置。

这应该使您非常接近解决方案,但是您可能需要添加一些其他检查,...或者您可以将此逻辑限制为只允许某些不希望移动的范围。

至于第二个问题, 请看Range.Cut方法 我记录了一个移动范围的宏,这是excel用于移动范围的代码。

同样, 设置整个范围的值比循环遍历单元格和设置单元格值要快得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM