ডাব্লুপিএফ ডেটাগ্রিডে একক ক্লিক সম্পাদনা করুন


92

আমি চাই যে ব্যবহারকারীটি সেলটি সম্পাদনা মোডে রাখতে সক্ষম হবে এবং একক ক্লিকের সাথে সেলটি যে সারিটি রয়েছে তাতে হাইলাইট করতে পারবে। ডিফল্ট হিসাবে, এটি ডাবল ক্লিক হয়।

আমি কীভাবে এটিকে ওভাররাইড করব বা বাস্তবায়ন করব?


আপনি কি ডাব্লুপিএফ টুলকিটের মধ্যে পাওয়া ডেটাগ্রিড ব্যবহার করছেন?
মায়ার্মিয়ান

4
আপনি কী চেষ্টা করেছেন এবং কীভাবে এটি কার্যকর হয় না সে সম্পর্কে কি আমাদের আরও কিছু তথ্য দেওয়া সম্ভব হবে?
জাচ জনসন

উত্তর:


76

আমি এই সমস্যাটিকে কীভাবে সমাধান করেছি তা এখানে:

<DataGrid DataGridCell.Selected="DataGridCell_Selected" 
          ItemsSource="{Binding Source={StaticResource itemView}}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Nom" Binding="{Binding Path=Name}"/>
        <DataGridTextColumn Header="Age" Binding="{Binding Path=Age}"/>
    </DataGrid.Columns>
</DataGrid>

এই ডেটাগ্রিডটি কালেকশনভিউসোর্সকে আবদ্ধ (ডামি ব্যক্তিযুক্ত) বস্তুযুক্ত)।

যাদুটি সেখানে ঘটে: ডেটাগ্রিডসেল.সিলেক্টড = "ডেটাগ্রিডসেল_লেক্টেড"

আমি কেবল ডেটাগ্রিড সেলের নির্বাচিত ইভেন্টটিকে হুক করেছি এবং ডেটাগ্রিডে বিগনেইডিট () কল করি।

ইভেন্ট হ্যান্ডলারের পিছনে কোডটি এখানে রয়েছে:

private void DataGridCell_Selected(object sender, RoutedEventArgs e)
{
    // Lookup for the source to be DataGridCell
    if (e.OriginalSource.GetType() == typeof(DataGridCell))
    {
        // Starts the Edit on the row;
        DataGrid grd = (DataGrid)sender;
        grd.BeginEdit(e);
    }
}

8
আপনি SelectionUnitডেটাগ্রিডে সম্পত্তি সেট করে ইতিমধ্যে নির্বাচিত সারি সমস্যাটি পেতে পারেন Cell
ম্যাট উইনকলার 21

ধরুন আমার ডেটাগ্রিডসেলটিতে আমার কাছে একটি টেক্সটবক্স রয়েছে। আমি ফোন করার পরে grd.BeginEdit(e), আমি চাই যে সেই ঘরে থাকা পাঠ্যবক্সের ফোকাস রয়েছে। আমি এটা কিভাবে করবো? আমি FindName("txtBox")ডেটাগ্রিডসেল এবং ডেটাগ্রিড উভয়কেই কল করার চেষ্টা করেছি , তবে এটি আমার কাছে বাতিল হয়ে যায়।
ব্যবহারকারী 1214135

গটফোকস = "ডেটাগ্রিড_গটফোকাস" অনুপস্থিত বলে মনে হচ্ছে?
synergetic

4
এটি ভালভাবে কাজ করে, তবে আমি এটি করার পরামর্শ দেব না। আমি এটি আমার প্রকল্পে ব্যবহার করেছি এবং মানক ডিজির আচরণে রোলব্যাক করার সিদ্ধান্ত নিয়েছি। ভবিষ্যতে, যখন আপনার ডিজি বাড়বে এবং জটিল হবে, আপনি বৈধতার সাথে নতুন সারি এবং অন্যান্য অদ্ভুত আচরণ যুক্ত করে সমস্যাগুলি পাবেন।
হোয়াইট.জাজ

4
@ স্ট্যান্ডার্ড ডিজিজ আচরণে আপনি রোলব্যাক তৈরি করার পরে ক্লাবটি খুশি হয়েছে? কারণ এই প্রশ্নটি জিজ্ঞাসা করার মূল কারণটি হ'ল মানক ডিজি সক্ষমতায় সম্পাদনাটি ব্যবহারকারী বান্ধব নয় কারণ ডিজি সম্পাদনা মোডে আসার আগে এটি ক্লিক করার জন্য খুব বেশি সময় প্রয়োজন।
এইএমএলভিজি

42

আমার পক্ষে কাজ করা সমাধানের সন্ধানের জন্য আমার পক্ষে মাইकल বার্গারনের উত্তরটি একটি ভাল সূচনা ছিল। একই সারিতে থাকা সেলগুলিতে সিঙ্গল-ক্লিক সম্পাদনা করার অনুমতি দেওয়ার জন্য আমাকে এডিট করতে হবে কিছুটা। সিলেকশন ইউনিট সেল ব্যবহার করা আমার পক্ষে কোনও বিকল্প ছিল না।

ডাটাগ্রিডসেল.সিলিগ্রেড ইভেন্টটি ব্যবহার করার পরিবর্তে যা প্রথম বারের জন্য একটি সারির সেলটি ক্লিক করা হয় কেবল তখনই আমি ডেটাগ্রিডসেল.গটফোকাস ইভেন্টটি ব্যবহার করি।

<DataGrid DataGridCell.GotFocus="DataGrid_CellGotFocus" />

আপনি যদি এটি করেন তবে আপনার সর্বদা সঠিক ঘরটি কেন্দ্রীভূত এবং সম্পাদনা মোডে থাকবে, তবে ঘরে কোনও নিয়ন্ত্রণ কেন্দ্রীভূত হবে না, এটি আমি এর মতো সমাধান করেছি

private void DataGrid_CellGotFocus(object sender, RoutedEventArgs e)
{
    // Lookup for the source to be DataGridCell
    if (e.OriginalSource.GetType() == typeof(DataGridCell))
    {
        // Starts the Edit on the row;
        DataGrid grd = (DataGrid)sender;
        grd.BeginEdit(e);

        Control control = GetFirstChildByType<Control>(e.OriginalSource as DataGridCell);
        if (control != null)
        {
            control.Focus();
        }
    }
}

private T GetFirstChildByType<T>(DependencyObject prop) where T : DependencyObject
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(prop); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild((prop), i) as DependencyObject;
        if (child == null)
            continue;

        T castedProp = child as T;
        if (castedProp != null)
            return castedProp;

        castedProp = GetFirstChildByType<T>(child);

        if (castedProp != null)
            return castedProp;
    }
    return null;
}

4
চেকবাক্সগুলি কি আমার জন্য কাজ করে না? আমার এখনও তাদের ডাবল ক্লিক করতে হবে
টমাস ক্লেমার

9

থেকে: http://wpf.codeplex.com/wikipage?title=Single- ক্লিক করুন 2020 সম্পাদনা

এক্সএএমএল:

<!-- SINGLE CLICK EDITING -->
<Style TargetType="{x:Type dg:DataGridCell}">
    <EventSetter Event="PreviewMouseLeftButtonDown" Handler="DataGridCell_PreviewMouseLeftButtonDown"></EventSetter>
</Style>

কোড পিছনে:

//
// SINGLE CLICK EDITING
//
private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    DataGridCell cell = sender as DataGridCell;
    if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
    {
        if (!cell.IsFocused)
        {
            cell.Focus();
        }
        DataGrid dataGrid = FindVisualParent<DataGrid>(cell);
        if (dataGrid != null)
        {
            if (dataGrid.SelectionUnit != DataGridSelectionUnit.FullRow)
            {
                if (!cell.IsSelected)
                    cell.IsSelected = true;
            }
            else
            {
                DataGridRow row = FindVisualParent<DataGridRow>(cell);
                if (row != null && !row.IsSelected)
                {
                    row.IsSelected = true;
                }
            }
        }
    }
}

static T FindVisualParent<T>(UIElement element) where T : UIElement
{
    UIElement parent = element;
    while (parent != null)
    {
        T correctlyTyped = parent as T;
        if (correctlyTyped != null)
        {
            return correctlyTyped;
        }

        parent = VisualTreeHelper.GetParent(parent) as UIElement;
    }

    return null;
}

4
এটি নির্দিষ্ট ক্ষেত্রে কার্যকর হয় না, এবং এরপরে আরও জটিল তারপরে মিকেল বার্গারনস সলিউশন।
সুইসকোডার

আমার জন্য, এটি প্রায় সমাধান ছিল। আমার একটি "প্রিভিউমাউস লেফট বাটনআপ" ইভেন্ট হ্যান্ডলার যুক্ত করার দরকার ছিল এবং সেখানে ঠিক একই কোডটি রেখেছিলাম।
নস্টর সানচেজ এ।

আপনার যদি একটি কম্বোবক্স হয় তবে এটি কাজ করে না। পূর্বরূপ ক্লিকটি কম্বোবক্সের পপআপে ক্লিকগুলি দেখে, তারপরে সেল.ফোকাস কল স্ক্রুগুলি সবকিছু আপ করে। সবচেয়ে সহজ সমাধানটি হ'ল এমন একটি বিভাগ যুক্ত করা যা মাউস ইভেন্টের মূল উত্সটি দেখায়, এটি ফাইন্ডভিজুয়ালপ্যারেন্ট ব্যবহার করে এটি ডেটাগ্রিডের ভিতরে রয়েছে কিনা তা দেখতে। যদি না হয় তবে অন্য কোনও কাজ করবেন না।
জন গার্ডনার

7

থেকে সমাধান http://wpf.codeplex.com/wikipage?title=Single-Click%20Editing আমার জন্য কাজ করে মহান, কিন্তু আমি একটি স্টাইল একটি ResourceDictionary সংজ্ঞায়িত ব্যবহার প্রত্যেক DataGrid এর জন্য সক্ষম। রিসোর্স অভিধানে হ্যান্ডলারগুলি ব্যবহার করতে আপনাকে এটিতে একটি কোড-পিছনের ফাইল যুক্ত করতে হবে। আপনি এটি কীভাবে করেন তা এখানে:

এটি একটি ডেটাগ্রিডসাইলস.এক্সএএমএল রিসোর্স অভিধান:

    <ResourceDictionary x:Class="YourNamespace.DataGridStyles"
                x:ClassModifier="public"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <Style TargetType="DataGrid">
            <!-- Your DataGrid style definition goes here -->

            <!-- Cell style -->
            <Setter Property="CellStyle">
                <Setter.Value>
                    <Style TargetType="DataGridCell">                    
                        <!-- Your DataGrid Cell style definition goes here -->
                        <!-- Single Click Editing -->
                        <EventSetter Event="PreviewMouseLeftButtonDown"
                                 Handler="DataGridCell_PreviewMouseLeftButtonDown" />
                    </Style>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>

মূল উপাদানটিতে x: শ্রেণীর বৈশিষ্ট্যটি নোট করুন। একটি ক্লাস ফাইল তৈরি করুন। এই উদাহরণে এটি ডেটাগ্রিডসাইলস.এক্স্যামল সি হবে । এই কোডটি ভিতরে রাখুন:

using System.Windows.Controls;
using System.Windows;
using System.Windows.Input;

namespace YourNamespace
{
    partial class DataGridStyles : ResourceDictionary
    {

        public DataGridStyles()
        {
          InitializeComponent();
        }

     // The code from the myermian's answer goes here.
}

লিঙ্কটি মারা গেছে (15 টি চরিত্রের সীমা)
ব্লিচডোজ

4

আমি এইভাবে দুজন কোনেভিয়ের পরামর্শের ভিত্তিতে পছন্দ করি। আপনি এটি ক্লিক করুন))

<DataGrid.Resources>

    <Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}">
        <Style.Triggers>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="IsMouseOver"
                                   Value="True" />
                        <Condition Property="IsReadOnly"
                                   Value="False" />
                    </MultiTrigger.Conditions>
                    <MultiTrigger.Setters>
                        <Setter Property="IsEditing"
                                Value="True" />
                    </MultiTrigger.Setters>
                </MultiTrigger>
        </Style.Triggers>
    </Style>

</DataGrid.Resources>

এটি কোনও কাজ করে না যদি কোনও কম্বোবক্স একটি সম্পাদনা টেম্পলেট হিসাবে ব্যবহৃত হয়, আমি অন্যকে চেক বাক্সের মতো ধরে নেব যা মাউস ইভেন্টগুলি ক্যাপচার করে তাও ভেঙে যাবে
স্টিভ

আমার জন্য এটি কম্বোবক্স কলামগুলির সাথে কাজ করে, তবে "নতুন আইটেম লাইন" (শেষ লাইন) এর টেক্সটবক্সে একটি বিস্ময়কর আচরণ রয়েছে: প্রথম ক্লিকে আমি ইনপুট ফোকাস পাই এবং জিনিসটি টাইপ করতে পারি When যখন আমি ঘর থেকে মাউসটি সরিয়ে নিই When , পাঠ্যবক্সের মান অদৃশ্য হয়ে যায়। আরও টাইপ করার সময়, সদ্য প্রবেশ করা পাঠ্যটি সঠিকভাবে সংরক্ষণ করা হয় (এটি যেমন ইচ্ছা হিসাবে একটি নতুন এন্ট্রি তৈরি করে)। এটি একটি কম্বোবক্সকলাম সহও ঘটে।
ফ্র্যাঙ্কএম

প্রথমদিকে ঠিকঠাক কাজ করার মতো মনে হয়, তবে আমার ডেটাগ্রিডকে পুরোপুরি জড়িয়ে ফেলেছে, যখন আমি বাছাই করার চেষ্টা করি, এই কোডটি ছাড়াই বাছাইয়ের সাথে সবকিছু ঠিকঠাক কাজ করে।
চন্দ্রপ্রকাশ

3

আমি এটি একটি ট্রিগার যুক্ত করে সমাধান করেছি যা মাউসটি শেষ হয়ে যাওয়ার পরে ডেটাগ্রিডসেল এর সম্পত্তিটিকে আইসডিটিং ট্রু সেট করে। এটি আমার বেশিরভাগ সমস্যার সমাধান করেছে। এটি কম্বোবক্সেও কাজ করে।

<Style TargetType="DataGridCell">
     <Style.Triggers>
         <Trigger Property="IsMouseOver" Value="True">
             <Setter Property="IsEditing" Value="True" />
         </Trigger>
     </Style.Triggers>
 </Style>

4
কাজ করে না ... মাউস ঘর ছেড়ে যাওয়ার সাথে সাথে এটি সম্পাদনাটি হারাবে। সুতরাং আপনি 1) যে ঘরে আপনি সম্পাদনা করতে চান তার উপর বাম ক্লিক করুন। 2) মাউসটিকে উপায়ের বাইরে নিয়ে যান 3) টাইপ করা শুরু করুন। আপনার টাইপিং কাজ করে না কারণ ঘরটি আর সম্পাদনা মোডে নেই।
স্কারসনিক

4
আমার জন্য কাজ করে না। আমার জন্য পাঠ্যবক্স সম্পাদনা করতে বাধা দেয়
ব্লিচডোজ

তবে এই পদ্ধতির সাথে একটি সমস্যা আছে, আমি সম্পাদনার জন্য 1 ম কলামটি লক করেছি, এই পদ্ধতির সাথে এটি 1 ম কলামটি সম্পাদনযোগ্যও করে তুলছে!
চন্দ্রপ্রকাশ

3

আমি এমভিভিএম-তে একক ক্লিকে সেল সম্পাদনা করার সন্ধান করছি এবং এটি করার এটি অন্য উপায়।

  1. এক্সএএমএল এ আচরণ যুক্ত করা হচ্ছে

    <UserControl xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
                 xmlns:myBehavior="clr-namespace:My.Namespace.To.Behavior">
    
        <DataGrid>
            <i:Interaction.Behaviors>
                <myBehavior:EditCellOnSingleClickBehavior/>
            </i:Interaction.Behaviors>
        </DataGrid>
    </UserControl>
    
  2. এডিটসেলঅনসিংকলক্লিকবিহায়ার ক্লাস সিস্টেম. উইন্ডোস.ইন্টেরাকটিভিটি.বিহেভিয়ার প্রসারিত করে;

    public class EditCellOnSingleClick : Behavior<DataGrid>
    {
        protected override void OnAttached()
        {
            base.OnAttached();
            this.AssociatedObject.LoadingRow += this.OnLoadingRow;
            this.AssociatedObject.UnloadingRow += this.OnUnloading;
        }
    
        protected override void OnDetaching()
        {
            base.OnDetaching();
            this.AssociatedObject.LoadingRow -= this.OnLoadingRow;
            this.AssociatedObject.UnloadingRow -= this.OnUnloading;
        }
    
        private void OnLoadingRow(object sender, DataGridRowEventArgs e)
        {
            e.Row.GotFocus += this.OnGotFocus;
        }
    
        private void OnUnloading(object sender, DataGridRowEventArgs e)
        {
            e.Row.GotFocus -= this.OnGotFocus;
        }
    
        private void OnGotFocus(object sender, RoutedEventArgs e)
        {
            this.AssociatedObject.BeginEdit(e);
        }
    }
    

ভয়েলা!


1

ব্যবহারকারী 2134678 এর উত্তর নিয়ে দুটি সমস্যা রয়েছে। একটি খুব গৌণ এবং এর কার্যকরী প্রভাব নেই। অন্যটি মোটামুটি তাৎপর্যপূর্ণ।

প্রথম ইস্যুতে যে গটফোকাসটি আসলে ডেটাগ্রিডের বিরুদ্ধে ডাকা হচ্ছে, বাস্তবে ডেটাগ্রিডসেল নয়। এক্সএএমএল-তে ডেটাগ্রিডসেল কোয়ালিফায়ার অপ্রয়োজনীয়।

উত্তরের সাথে আমি যে প্রধান সমস্যাটি পেয়েছি তা হ'ল এন্টার কী আচরণটি নষ্ট হয়ে গেছে। এন্টার আপনাকে সাধারণ ডাটাগ্রিড আচরণে বর্তমান কক্ষের নীচের পরবর্তী কক্ষে নিয়ে যেতে হবে। তবে, পর্দার আড়ালে আসলে যা ঘটে তা হ'ল গটফোকাস ইভেন্টটি দু'বার বলা হবে। একবার বর্তমান কক্ষ ফোকাস হারাতে, এবং একবার নতুন সেল ফোকাস অর্জন। তবে যতক্ষণ না সেই প্রথম কক্ষে বিগিনিএডিট কল করা হয়, ততক্ষণ পরের ঘরটি কখনই সক্রিয় হয় না। আপশটটি হ'ল আপনার এক-ক্লিক সম্পাদনা রয়েছে, তবে যে কেউ আক্ষরিকভাবে গ্রিডে ক্লিক করছেন না সে অসুবিধা হতে চলেছে এবং কোনও ব্যবহারকারী-ইন্টারফেস ডিজাইনারকে ধরে নিতে হবে না যে সমস্ত ব্যবহারকারী মাউস ব্যবহার করছে। (কীবোর্ড ব্যবহারকারীরা বাছাই করে ট্যাবটি ব্যবহার করে এটি ঘিরে ফেলতে পারেন, তবে তার অর্থ এখনও তারা হুপসের মধ্য দিয়ে ঝাঁপিয়ে পড়ছে যা তাদের প্রয়োজন হবে না))

তাহলে এই সমস্যার সমাধান? কক্ষের জন্য ইভেন্ট কীডাউন হ্যান্ডেল করুন এবং কীটি যদি কীটি প্রবেশ করান কী হয় তবে একটি পতাকা সেট করুন যা প্রথম সেলে গুলি চালানো থেকে বিগনেডিটকে থামিয়ে দেয়। এখন এন্টার কীটি এটির মতো আচরণ করে।

শুরু করতে, আপনার ডেটাগ্রিডে নিম্নলিখিত স্টাইলটি যুক্ত করুন:

<DataGrid.Resources>
    <Style TargetType="{x:Type DataGridCell}" x:Key="SingleClickEditingCellStyle">
        <EventSetter Event="KeyDown" Handler="DataGridCell_KeyDown" />
    </Style>
</DataGrid.Resources>

যে কলামগুলির জন্য আপনি এক-ক্লিক সক্ষম করতে চান তার "সেলস্টাইল" বৈশিষ্ট্যে সেই স্টাইলটি প্রয়োগ করুন।

তারপরে আপনার গটফোকাস হ্যান্ডলারে আপনার পিছনের কোডে নিম্নলিখিতটি রয়েছে (নোট করুন যে আমি এখানে ভিবি ব্যবহার করছি কারণ এটি আমাদের "এক-ক্লিকের ডেটা গ্রিডের অনুরোধ" ক্লায়েন্টটি বিকাশের ভাষা হিসাবে চেয়েছিল):

Private _endEditing As Boolean = False

Private Sub DataGrid_GotFocus(ByVal sender As Object, ByVal e As RoutedEventArgs)
    If Me._endEditing Then
        Me._endEditing = False
        Return
    End If

    Dim cell = TryCast(e.OriginalSource, DataGridCell)

    If cell Is Nothing Then
        Return
    End If

    If cell.IsReadOnly Then
        Return
    End If

    DirectCast(sender, DataGrid).BeginEdit(e)
    .
    .
    .

তারপরে আপনি কীডাউন ইভেন্টের জন্য আপনার হ্যান্ডলারটি যুক্ত করুন:

Private Sub DataGridCell_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)
    If e.Key = Key.Enter Then
        Me._endEditing = True
    End If
End Sub

এখন আপনার কাছে এমন একটি ডেটাগ্রিড রয়েছে যা বাক্সের বাইরে প্রয়োগের কোনও মৌলিক আচরণ পরিবর্তন করে নি এবং এখনও একক-ক্লিক সম্পাদনা সমর্থন করে।


0

আমি জানি যে আমি পার্টিতে কিছুটা দেরি করেছি তবে আমারও একই সমস্যা ছিল এবং একটি ভিন্ন সমাধান নিয়ে এসেছি:

     public class DataGridTextBoxColumn : DataGridBoundColumn
 {
  public DataGridTextBoxColumn():base()
  {
  }

  protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
  {
   throw new NotImplementedException("Should not be used.");
  }

  protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
  {
   var control = new TextBox();
   control.Style = (Style)Application.Current.TryFindResource("textBoxStyle");
   control.FontSize = 14;
   control.VerticalContentAlignment = VerticalAlignment.Center;
   BindingOperations.SetBinding(control, TextBox.TextProperty, Binding);
    control.IsReadOnly = IsReadOnly;
   return control;
  }
 }

        <DataGrid Grid.Row="1" x:Name="exportData" Margin="15" VerticalAlignment="Stretch" ItemsSource="{Binding CSVExportData}" Style="{StaticResource dataGridStyle}">
        <DataGrid.Columns >
            <local:DataGridTextBoxColumn Header="Sample ID" Binding="{Binding SampleID}" IsReadOnly="True"></local:DataGridTextBoxColumn>
            <local:DataGridTextBoxColumn Header="Analysis Date" Binding="{Binding Date}" IsReadOnly="True"></local:DataGridTextBoxColumn>
            <local:DataGridTextBoxColumn Header="Test" Binding="{Binding Test}" IsReadOnly="True"></local:DataGridTextBoxColumn>
            <local:DataGridTextBoxColumn Header="Comment" Binding="{Binding Comment}"></local:DataGridTextBoxColumn>
        </DataGrid.Columns>
    </DataGrid>

আপনি দেখতে পাচ্ছেন যে আমি নিজের নিজস্ব ডেটাগ্রিডটেক্সটকালাম লিখেছি যা সবকিছু ডাটাগ্রিডবাউন্ড কলামে বন্টন করে। জেনারেটেলমেন্ট পদ্ধতিটি ওভাররাইড করে এবং ঠিক সেখানে একটি টেক্সটবক্স নিয়ন্ত্রণ ফিরিয়ে দিয়ে সম্পাদনা উপাদানটি তৈরি করার পদ্ধতিটি কখনও কল হয় না। একটি ভিন্ন প্রকল্পে আমি এটি একটি ডেটপিকার কলাম বাস্তবায়নের জন্য ব্যবহার করেছি, সুতরাং এটি চেকবক্স এবং কম্বোবক্সগুলির জন্যও কাজ করা উচিত।

এটি ডেটাগ্রিডের বাকী আচরণগুলিকে প্রভাবিত করে বলে মনে হচ্ছে না ... কমপক্ষে আমি কোনও পার্শ্ব প্রতিক্রিয়া লক্ষ্য করিনি এবং এখনও পর্যন্ত কোনও নেতিবাচক প্রতিক্রিয়া পাইনি।


-1

হালনাগাদ

আপনার ঘরের একটি পাঠ্যবাক্স থাকে (সম্পাদনা এবং অ-সম্পাদনা মোডের মধ্যে কোনও পার্থক্য নেই) এর সাথে যদি আপনি ভাল থাকেন তবে একটি সহজ সমাধান। এইভাবে একক ক্লিক সম্পাদনা বাক্সের বাইরে কাজ করে। এটি অন্যান্য উপাদান যেমন কম্বোবক্স এবং বোতামগুলির সাথেও কাজ করে। অন্যথায় আপডেটের নীচে সমাধানটি ব্যবহার করুন।

<DataGridTemplateColumn Header="My Column header">
   <DataGridTemplateColumn.CellTemplate>
      <DataTemplate>
         <TextBox Text="{Binding MyProperty } />
      </DataTemplate>
   </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

আপডেট শেষ

ভাড়া

আমি এখানে এবং গুগলে যা কিছু পেয়েছি তা চেষ্টা করেছিলাম এবং এমনকি আমার নিজের সংস্করণ তৈরির চেষ্টা করেছি। তবে প্রতিটি উত্তর / সমাধান মূলত পাঠ্যবক্স কলামগুলির জন্য কাজ করে তবে অন্যান্য সমস্ত উপাদান (চেকবক্স, কম্বোবক্স, বোতাম কলাম) এর সাথে কাজ করে না, এমনকি সেই অন্যান্য উপাদান কলামগুলিও ভেঙে ফেলেছিল বা এর অন্য কোনও পার্শ্ব প্রতিক্রিয়া রয়েছে। ডেটাগ্রিড তৈরি করার জন্য মাইক্রোসফটকে ধন্যবাদ সেই কুৎসিত আচরণ করে এবং আমাদের এই হ্যাকগুলি তৈরি করতে বাধ্য করে। সে কারণে আমি এমন একটি সংস্করণ তৈরি করার সিদ্ধান্ত নিয়েছি যা অন্য কলামগুলিকে প্রভাবিত না করে সরাসরি একটি পাঠ্যবক্স কলামে স্টাইলের সাথে প্রয়োগ করা যেতে পারে।

বৈশিষ্ট্য

  • পিছনে কোনও কোড নেই। এমভিভিএম বন্ধুত্বপূর্ণ।
  • এটি একই বা ভিন্ন সারিগুলির বিভিন্ন পাঠ্যবাক্স কক্ষে ক্লিক করার সময় কাজ করে।
  • ট্যাব এবং ENTER কীগুলি কাজ করে।
  • এটি অন্যান্য কলামগুলিকে প্রভাবিত করে না।

সূত্র

আমি এই সমাধানটি এবং @ আমার উত্তরটি ব্যবহার করেছি এবং এগুলি সংযুক্ত আচরণ হিসাবে পরিবর্তিত করেছি। http://wpf-t्यूट-

এটি কিভাবে ব্যবহার করতে

এই স্টাইল যুক্ত করুন। BasedOnগুরুত্বপূর্ণ যখন আপনি কিছু ব্যবহার করেন অভিনব শৈলী আপনার datagrid এবং আপনি সেগুলি হারাবেন চাই না।

<Window.Resources>
    <Style x:Key="SingleClickEditStyle" TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource {x:Type DataGridCell}}">
        <Setter Property="local:DataGridTextBoxSingleClickEditBehavior.Enable" Value="True" />
    </Style>
</Window.Resources>

CellStyleআপনার প্রতিটি এর সাথে স্টাইল প্রয়োগ করুন DataGridTextColumns:

<DataGrid ItemsSource="{Binding MyData}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="My Header" Binding="{Binding Comment}" CellStyle="{StaticResource SingleClickEditStyle}" />         
    </DataGrid.Columns>
</DataGrid>

আর এখন আপনার MainViewModel হিসাবে একই নামস্থান এই বর্গ যোগ (বা অন্য নামস্থান। কিন্তু তারপর আপনি চেয়ে অন্যান্য নামস্থান উপসর্গ ব্যবহার করতে হবে local)। সংযুক্ত আচরণের কুরুচিপূর্ণ বয়লারপ্লেট কোড জগতে স্বাগতম।

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace YourMainViewModelNameSpace
{
    public static class DataGridTextBoxSingleClickEditBehavior
    {
        public static readonly DependencyProperty EnableProperty = DependencyProperty.RegisterAttached(
            "Enable",
            typeof(bool),
            typeof(DataGridTextBoxSingleClickEditBehavior),
            new FrameworkPropertyMetadata(false, OnEnableChanged));


        public static bool GetEnable(FrameworkElement frameworkElement)
        {
            return (bool) frameworkElement.GetValue(EnableProperty);
        }


        public static void SetEnable(FrameworkElement frameworkElement, bool value)
        {
            frameworkElement.SetValue(EnableProperty, value);
        }


        private static void OnEnableChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (d is DataGridCell dataGridCell)
                dataGridCell.PreviewMouseLeftButtonDown += DataGridCell_PreviewMouseLeftButtonDown;
        }


        private static void DataGridCell_PreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            EditCell(sender as DataGridCell, e);
        }

        private static void EditCell(DataGridCell dataGridCell, RoutedEventArgs e)
        {
            if (dataGridCell == null || dataGridCell.IsEditing || dataGridCell.IsReadOnly)
                return;

            if (dataGridCell.IsFocused == false)
                dataGridCell.Focus();

            var dataGrid = FindVisualParent<DataGrid>(dataGridCell);
            dataGrid?.BeginEdit(e);
        }


        private static T FindVisualParent<T>(UIElement element) where T : UIElement
        {
            var parent = VisualTreeHelper.GetParent(element) as UIElement;

            while (parent != null)
            {
                if (parent is T parentWithCorrectType)
                    return parentWithCorrectType;

                parent = VisualTreeHelper.GetParent(parent) as UIElement;
            }

            return null;
        }
    }
}

-3
 <DataGridComboBoxColumn.CellStyle>
                        <Style TargetType="DataGridCell">
                            <Setter Property="cal:Message.Attach" 
                            Value="[Event MouseLeftButtonUp] = [Action ReachThisMethod($source)]"/>
                        </Style>
                    </DataGridComboBoxColumn.CellStyle>
 public void ReachThisMethod(object sender)
 {
     ((System.Windows.Controls.DataGridCell)(sender)).IsEditing = true;

 }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.