小编Ala*_*ain的帖子

如何修复无法将最后一个元素滚动到视图中的Excel列表框

我在excel UI中遇到的一个杀手级问题,因为只要我记得,就是列表框滚动.

如果列表框中有更多可以显示的元素,则会显示一个scoll栏.但是,在某些情况下,将条形图一直滚动到列表底部并将其释放,将向上"跳跃"条形向下,您将无法看到列表中的最后一项.这在这里说明: 无法一直向下滚动

有许多论坛帖子提出了这个问题,解决方案一直是"将整数高度属性设置为false,然后再将其设置为true".这样做会稍微调整列表框的大小,使其高度四舍五入到单行的高度,然后不会隐藏任何项目.

With lstbox
    .IntegralHeight = False
    .Height = myHeight
    .IntegralHeight = True
End With
Run Code Online (Sandbox Code Playgroud)

但是,在某些情况下,这不起作用.如果你是:

  1. 以编程方式设置列表框的高度
  2. 使用简单的列表框选择(fmMultiSelectSingle)

然后简单地将积分高度设置为false,然后在更改高度之后或之间设置true将调整列表框的高度,但是当您向下滚动时,问题仍然存在 - 无法看到最后一项.

这个令人沮丧的问题的关键在于,虽然互联网上的其他人都在确认'integralHeight'解决方案适用于他们,但这些非常特殊的情况令人沮丧,想知道为什么它对他们不起作用.那么他们如何得到他们的修复?

excel user-interface vba listbox

13
推荐指数
2
解决办法
2万
查看次数

如何从嵌套的try-catch块中重新抛出先前的异常?(C#)

我有尝试类型转换的代码.如果失败,我想尝试别的东西,如果失败,则重新抛出第一次转换尝试的原始异常.问题是,我知道要重新抛出的唯一方法就是throw;"坐在拦截块的末端".当我只希望从另一个catch块中发生重新抛出时会发生什么?

try 
{
    valueFromData = Convert.ChangeType(valueFromData, pi.PropertyType);
} 
catch(InvalidCastException e)
{
    Debug.WriteLine(String.Concat("Info - Direct conversion failed. Attempting to convert using String as an intermidiate type."));
    try { valueFromData = Convert.ChangeType(valueFromData.ToString(), pi.PropertyType); }
    catch { throw e; }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我必须使用' throw e;',它会重置调用堆栈.

到目前为止我唯一的解决方法是(imo)粗略:

bool handled = true;
... 
catch { handled = false; }
if( !handled ) throw;
Run Code Online (Sandbox Code Playgroud)

c# exception-handling

12
推荐指数
1
解决办法
1566
查看次数

在c#中初始化多维数组(与其他数组一起)

在C#中,可以使用如下常量初始化多维数组:

Object[,] twodArray = new Object[,] { {"00", "01", "02"}, 
                                      {"10", "11", "12"},
                                      {"20", "21", "22"} };
Run Code Online (Sandbox Code Playgroud)

我个人认为使用硬编码常量初始化数组对于测试练习以外的任何其他内容都是无用的.无论如何,我迫切需要做的是使用现有数组初始化一个新的多维数组.(具有相同的项目数,但内容当然仅在运行时定义).

我想做的一个例子是.

Object[] first  = new Object[] {"00", "01", "02"};
Object[] second = new Object[] {"10", "11", "12"};
Object[] third  = new Object[] {"20", "21", "22"};
Object[,] twodArray = new Object[,] { first, second, third };
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不能编译为有效代码.有趣的是,当我尝试的时候

Object[,] twodArray = new Object[,] { {first}, {second}, {third} };
Run Code Online (Sandbox Code Playgroud)

代码确实编译并运行,但结果并不理想 - 一个3乘3的对象数组,出来的是一个3乘1的数组,每个数组都有3个元素.发生这种情况时,我无法使用以下方法访问我的数组:

Object val = twodArray[3,3];
Run Code Online (Sandbox Code Playgroud)

我得走了:

Object val = twodArray[3,1][3];
Run Code Online (Sandbox Code Playgroud)

这显然不是理想的结果.

那么,有没有办法从多个现有数组初始化这个新的2D数组而不需要迭代?

c# arrays initialization multidimensional-array

11
推荐指数
1
解决办法
8890
查看次数

观察集合中项目的PropertyChanged

我正在尝试挂钩INotifyPropertyChanged集合中对象的事件.

我在这个问题上见过的每一个答案都说要按如下方式处理:

void NotifyingItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    if( e.NewItems != null )
    {
        foreach( INotifyPropertyChanged item in e.NewItems )
        {
            item.PropertyChanged += new PropertyChangedEventHandler(CollectionItemChanged);
        }
    }
    if( e.OldItems != null )
    {
        foreach( ValidationMessageCollection item in e.OldItems )
        {
            item.PropertyChanged -= CollectionItemChanged;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,只要开发人员调用Clear()NotifyingItems集合,这就完全失败了.发生这种情况时,该事件处理函数被调用,e.Action == Reset并且两个e.NewItemse.OldItems等于null(我希望后者包含的所有项目).

问题是这些物品不会消失,而且它们不会被破坏,它们不再被当前的班级监控 - 但由于我从未有机会取消映射它们PropertyChangedEventHandler- 它们一直在调用我的CollectionItemChanged处理程序他们已从我的NotifyingItems列表中清除.如何以这种"完善的"模式处理这种情况?

c# wpf .net-4.0

11
推荐指数
2
解决办法
2894
查看次数

如何在不知道T是什么的情况下将类型T的项添加到List <T>?

我正在处理一个事件,它传递指向List和T newitem的事件args,我的工作是将newitem添加到List中.

如果不检查我所知道的所有类型,我怎么能这样做呢?

目前的代码是几十行:

private void DataGridCollectionViewSource_CommittingNewItem(object sender, DataGridCommittingNewItemEventArgs e)
{
  Type t = e.CollectionView.SourceCollection.GetType();

  if (t == typeof(List<Person>))
  {
    List<Person> source = e.CollectionView.SourceCollection as List<Person>;
    source.Add(e.Item as Person);
  }
  else if (t == typeof(List<Place>))
  {
    List<Place> source = e.CollectionView.SourceCollection as List<Place>;
    source.Add(e.Item as Place);
  }
  ...
Run Code Online (Sandbox Code Playgroud)

我更喜欢是否有可能做这样的事情:

((List<T>) e.CollectionView.SourceCollection).Add((T)e.Item);
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

c# generics wpf .net-4.0

10
推荐指数
1
解决办法
4131
查看次数

Spark“第一个”窗口函数比“最后一个”函数花费的时间长得多

我正在开发一个 pyspark 例程来插入配置表中的缺失值。

想象一个从 0 到 50,000 的配置值表。用户指定中间的几个数据点(例如 0、50、100、500、2000、500000),然后我们对余数进行插值。我的解决方案主要遵循这篇博客文章,只是我没有使用任何 UDF。

在对其性能进行故障排除时(大约需要 3 分钟),我发现一个特定的窗口函数占用了所有时间,而我所做的其他所有事情只花费了几秒钟。

这是主要感兴趣的区域 - 我使用窗口函数来填写上一个和下一个用户提供的配置值:

from pyspark.sql import Window, functions as F

# Create partition windows that are required to generate new rows from the ones provided
win_last = Window.partitionBy('PORT_TYPE', 'loss_process').orderBy('rank').rowsBetween(Window.unboundedPreceding, 0)
win_next = Window.partitionBy('PORT_TYPE', 'loss_process').orderBy('rank').rowsBetween(0, Window.unboundedFollowing)

# Join back in the provided config table to populate the "known" scale factors
df_part1 = (df_scale_factors_template
  .join(df_users_config, ['PORT_TYPE', 'loss_process', 'rank'], 'leftouter')
  # Add computed columns that can lookup the …
Run Code Online (Sandbox Code Playgroud)

performance window-functions apache-spark apache-spark-sql pyspark

10
推荐指数
1
解决办法
1844
查看次数

将对象转换为泛型类型

我有一段时间没有睡觉,所以这可能比我想象的要容易.

我有一个或多或少的泛型类:

public class Reference<T> where T : APIResource //<- APIResource is abstract btw
{
    private T _value = null;
    public T value
    { 
        get { return _value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

在其他地方,在自定义序列化方法中,有人传入的object实际上是一个实例Reference<(something)>.我只想跳到每个Reference<>对象都有的"value"属性,所以我想去:

string serialize(object o)
{
    return base.serialize( ((Reference<>) o).value );
}
Run Code Online (Sandbox Code Playgroud)

当然,生活并不那么简单,因为正如编译器所说:

using the generic type "Reference<T>" requires 1 type arguments

我怎么能做我想做的事?

c# generics serialization

9
推荐指数
1
解决办法
5519
查看次数

如何定义通用扩展方法

我试图定义一个扩展方法,可以返回由调用定义的类型的对象.

所需用途: Cat acat = guy.GiveMeYourPet<Cat>();

尝试实施

我可以毫无困难地定义这样的泛型方法:

public static T GiveMeYourPet<T>(Person a) { ... }

Cat acat = GiveMeYourPet<Cat>(guy);
Run Code Online (Sandbox Code Playgroud)

或者像这样的扩展方法:

public static Cat GiveMeYourPetCat<P>(this P self) where P : Person, ... { ... }

Cat acat = guy.GiveMeYourPetCat();
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试做我真正想要的事情时:

public static T GiveMeYourPet<T, P>(this P self) where P : Person, ... { ... }

Cat acat = guy.GiveMeYourPet<Cat>();
Run Code Online (Sandbox Code Playgroud)

编译器期望GiveMeYourPet()接收2个类型参数(即使通过调用对象上的扩展方法隐式提供了一个参数guy.

我能做些什么来完成这项工作?

请注意,我也尝试颠倒定义参数的顺序,但没有任何变化:

public static T GiveMeYourPet<P, T>(this P self)
Run Code Online (Sandbox Code Playgroud)

以下调用也不起作用,因为您无法在类型说明中进行方法调用:

Cat acat = guy.GiveMeYourPet<guy.GetType(), Cat>();
Run Code Online (Sandbox Code Playgroud)

c#

9
推荐指数
1
解决办法
301
查看次数

为什么Nullable <T>被认为是结构而不是类?

我正在尝试定义一个泛型类,它接受任何可以设置为null的类型:

public abstract class BundledValue_Classes<T> 
    where T : class
{
    private Tuple<T, object> _bundle= new Tuple<T, object>();
    public T Value
    { 
        get { return _bundle == null ? null : _bundle.Item1; }
        set { _bundle = new Tuple<T, object>(value, obj); }
    }
    //...
Run Code Online (Sandbox Code Playgroud)

这很好用.我还想创建一个派生类,它可以采用任何原始类型(int,double等),并简单地将其解析为与上面的类相同,但原语包含在Nullable中

public abstract class BundledValue_Structs<T> 
    : BundledValue_Classes<T?> 
    where T : struct
{
   //...
}
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,这不起作用.我收到错误:The type 'T?' must be a reference type in order to use it as parameter 'T' in the generic type or method …

c# generics nullable type-constraints

9
推荐指数
1
解决办法
1460
查看次数

使用VBA将ArrayFormula设置为许多Excel单元格

我有一个输出单个值的数组公式,我想给一大堆单元格这个相同的数组公式.问题是当我将数组公式分配给范围时,它以这样的方式解释公式,即它们共享对数组公式的单个调用的输出,而不是每个输出单独的值.

为了告诉你我的意思,我使用以下代码:

With MarginalData
    .Range(.Cells(2, 1), .Cells(13, .UsedRange.Columns.Count)).FormulaArray = pullFormula
End With
Run Code Online (Sandbox Code Playgroud)

我想要的是一个看起来像这样的结果: 期望的结果

当我在范围中的每个单元格中分别输入数组公式时,它就是这样.

我得到的是: 结果

第一个单元格中的数组公式的输出在所有列中重复 - 它们共享相同的输出.

我如何以编程方式分配数组公式,就像每个单元格分别分配一样?


公式是:

{= INDEX(!BatchResults,MATCH(TTID&CHAR(1)&ROW() - 1,BatchResultsTTIDS&CHAR(1)&BatchResultsLayers,0),MATCH(A $ 1,$ BatchTTIDData 1:$ 1,0))}

它必须作为数组公式放入,因为它不是在单个列上执行匹配,而是在两个连接列上执行匹配.列的串联必须作为数组返回,因此必须将公式作为数组公式输入.


到目前为止,最简单的解决方案是以下接受的答案的变体:

Const pullFormula = "=INDEX(BatchResults,MATCH(TTID&CHAR(1)&ROW()-1,BatchResultsTTIDS&CHAR(1)&BatchResultsLayers,0),MATCH(A$1,BatchTTIDData!$1:$1,0))"
With wrksht
    With .Range(.Cells(2, 1), .Cells(13, .UsedRange.Columns.Count))
        .Formula = pullFormula
        .FormulaArray = .FormulaR1C1
    End With
End With
Run Code Online (Sandbox Code Playgroud)

excel vba array-formulas

7
推荐指数
1
解决办法
2万
查看次数