1

Telerik を使用する Silverlight 5 プロジェクトがありますRadGridView。これRadGridViewにはRowDetails、 editable を含む がありますTextBoxTextBoxに達するまでこれにテキストを数回貼り付けるMaxLengthと、選択したグリッド行の最初の列が余分なテキストで自動的に編集されます。誰かがこれを見て修正しましたか?

試しに、ここにいくつかのソードがあります:

XAML

<telerik:RadGridView Name="gvMain" AutoGenerateColumns="False">
    <telerik:RadGridView.ChildTableDefinitions>
    <telerik:GridViewTableDefinition />
</telerik:RadGridView.ChildTableDefinitions>

<telerik:RadGridView.Columns>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Title}" />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding PageCount}" />
</telerik:RadGridView.Columns>

<telerik:RadGridView.HierarchyChildTemplate>
    <DataTemplate>
       <StackPanel Orientation="Horizontal">
           <TextBlock>Name</TextBlock>
           <TextBox Text="{Binding DataContext.Author.Name, RelativeSource={RelativeSource FindAncestor, AncestorType=StackPanel}}" 
                    MaxLength="20" Width="100" />
       </StackPanel>
    </DataTemplate>
</telerik:RadGridView.HierarchyChildTemplate>

モデル

public class Author
{
   public string Name { get; set; }
   public string LastName { get; set; }
}

public class Book
{
   public string Title { get; set; }
   public int PageCount { get; set; }
   public Author Author { get; set; }
}

コードビハインド

this.gvMain.ItemsSource = new List<Models.Book>()
  {
     new Book(){ Author = new Author(){ Name = "John", LastName = "Smith"}, 
                 Title = "Dummy", PageCount = 100}
  }; 
4

1 に答える 1

0

TextBoxRowDetailsComboBoxがクリップボードからテキストを貼り付けられない場合 (たとえば、にMaxLength達した場合)、行自体に中継される貼り付けイベントの処理を停止するようです。Ard so row は貼り付けられたテキストを挿入します。

私たちが実装した解決策は、TextBoxes を次の追加コードのみを持つカスタムのものに置き換えることです。

protected override void OnKeyDown(KeyEventArgs e)
 {
     if (IsPastingAndClipboardTextIsTooLarge(e.Key))
     {
        int textToFit = (MaxLength - Text.Length + SelectionLength);
        if (textToFit > 0)
        {
           var startIndex = SelectionStart;
           var textToPaste = Clipboard.GetText().Substring(0, Math.Min(textToFit, Clipboard.GetText().Length));
           int caretPosition = startIndex + textToPaste.Length;
           if (SelectionLength > 0)
              Text = Text.Remove(startIndex, SelectionLength);

           Text = Text.Insert(startIndex, textToPaste);
           SelectionStart = caretPosition;
        }

        e.Handled = true;
     }
     else base.OnKeyDown(e);
  }

  public bool IsPastingAndClipboardTextIsTooLarge(Key key)
  {
     return key == Key.V && ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) &&
            Clipboard.ContainsText() &&
            Text.Length + Clipboard.GetText().Length > MaxLength - SelectionLength;
  } 

ただしComboBoxes、いくつかのコードも必要になります。より良い解決策があれば教えてください!

于 2013-04-25T10:21:35.023 に答える