কীভাবে ডাব্লুপিএফ-এ গ্রিডভিউ কলামের ডেটা অটোসাইজ এবং ডান-সারিবদ্ধ করবেন?


89

কিভাবে আমি করতে পারি:

  • আইডি কলামে পাঠ্যটি ডান-সারিবদ্ধ করুন
  • দীর্ঘতম দৃশ্যমান ডেটা সহ প্রতিটি কলামের পাঠ্য দৈর্ঘ্য অনুসারে স্বয়ংক্রিয় আকার তৈরি করুন?

কোডটি এখানে:

<ListView Name="lstCustomers" ItemsSource="{Binding Path=Collection}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="ID" DisplayMemberBinding="{Binding Id}" Width="40"/>
            <GridViewColumn Header="First Name" DisplayMemberBinding="{Binding FirstName}" Width="100" />
            <GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding LastName}"/>
        </GridView>
    </ListView.View>
</ListView>

আংশিক উত্তর:

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

<ListView Name="lstCustomers" ItemsSource="{Binding Path=Collection}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="ID" Width="Auto">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Id}" TextAlignment="Right" Width="40"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Header="First Name" DisplayMemberBinding="{Binding FirstName}" Width="Auto" />
            <GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding LastName}" Width="Auto"/>
        </GridView>
    </ListView.View>
</ListView>

4
আপনি কি কখনও নিজের অটো-আকারের সমস্যার সমাধান খুঁজে পেয়েছেন? আমি একই জিনিস am সম্মুখীন।
ওসকার

4
@ অস্কার - তালিকার ভার্চুয়ালাইজেশন একটি অটো-সমাধানকে বাধা দেয়। তালিকায় কেবল বর্তমানে দৃশ্যমান আইটেমগুলিই জানে এবং সে অনুযায়ী আকার নির্ধারণ করে। যদি তালিকায় আরও আইটেম থাকে তবে এটি তাদের সম্পর্কে জানে না এবং তাই তাদের জন্য অ্যাকাউন্ট করতে পারে না। প্রোগ্রামিং ডাব্লুপিএফ - সেলস-গ্রিফিথ বইটি যদি আপনি ডেটা বন্ডিং ব্যবহার করে থাকেন তবে ম্যানুয়াল কলাম প্রস্থের প্রস্তাব দেয়। :(
গিশু

@Gishu ধন্যবাদ, যে আসলে জ্ঞান করে তোলে ..
অস্কার

যদি এমভিভিএম এবং বাইন্ডিং মানগুলি পরিবর্তন হয় তবে দয়া করে @ রল্ফ ওয়েসেলস উত্তরটি দেখুন।
জ্যাক বার্গার

উত্তর:


104

প্রতিটি কলামকে স্বয়ংক্রিয় করতে আপনি গ্রিডভিউ কলামে প্রস্থ = "অটো" সেট করতে পারেন।

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

সম্ভবত একটি সহজ সমাধান আছে, কিন্তু এটি কাজ করা উচিত।

দ্রষ্টব্য: সমাধানটির জন্য উভয় HorizontalContentAlignment = উইন্ডোতে প্রসারিত দরকার es রিসোর্সস এবং টেক্সটএলাইনমেন্ট = ডানদিকে সেল্টেম্পলেটটিতে।

<Window x:Class="WpfApplication6.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
    <Style TargetType="ListViewItem">
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
    </Style>
</Window.Resources>
<Grid>
    <ListView Name="lstCustomers" ItemsSource="{Binding Path=Collection}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="ID" Width="40">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Id}" TextAlignment="Right" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="First Name" DisplayMemberBinding="{Binding FirstName}" Width="Auto" />
                <GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding LastName}" Width="Auto"/>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>
</Window>

@ কেজেটিল - আমি কি একটি নির্দিষ্ট কলামে এই সেটিংটি প্রয়োগ করতে পারি?
গিশু

15
+1 এর জন্য: <সেটার সম্পত্তি = "অনুভূমিক কনটেন্টএলাইনমেন্ট" মান = "প্রসারিত" />
হেলিজ ক্লিন

দুর্দান্ত, তবে আমার কাছে 15 টি কলাম রয়েছে, সেগুলির জন্য সেলটেমপ্লেটটি পুনরাবৃত্তি করতে আমার কোনও উপায় নেই?
নিতিন চৌধুরী চৌদ্দ

7
আপনি গ্রিডভিউ কলাম থেকে ডিসপ্লে মেম্বারবাইন্ডিং অপসারণ করতে ভুলে গেলে এটিও কাজ করে না। টেম্পলেটটির তখন কোনও প্রভাব থাকবে না।
ফ্ল্লো করুন

@ মুহম্মদ কেন না?
ইটনাটালি

37

যদি সামগ্রীর প্রস্থ পরিবর্তন হয়, প্রতিটি কলাম আপডেট করার জন্য আপনাকে এই বিট কোডটি ব্যবহার করতে হবে:

private void ResizeGridViewColumn(GridViewColumn column)
{
    if (double.IsNaN(column.Width))
    {
        column.Width = column.ActualWidth;
    }

    column.Width = double.NaN;
}

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


4
আপনি এটি কি সংযুক্ত করবেন?
আর্মেন্টেজ

4
গ্রিড ডেটা আপডেট করার পরে এটিকে ম্যানুয়ালি গ্রিডভিউ কলামে চালান। যদি আপনি একটি ভিউমোডেল পেয়ে থাকেন তবে আপনি এতে প্রপার্টি চেঞ্জ করা ইভেন্টটিতে সদস্যতা নিতে এবং এটি চালাতে পারেন।
র্যান্ডম এঙ্গি

+1 তার জন্য ধন্যবাদ! এটি আমাকে অনেক সাহায্য করেছে! এই প্রশ্নের সাথে সম্পর্কিত নয়, তবে যাইহোক: আমি একটি কাস্টমাইজড তালিকা / গ্রিডভিউ প্রয়োগ করেছি যেখানে আপনি GUI এর মাধ্যমে রানটাইমগুলিতে কলামগুলি গতিশীলভাবে যুক্ত / সরাতে পারবেন। যাইহোক, যখন আমি একটি কলাম সরিয়ে এবং পুনরায় যুক্ত করেছি, এটি আর প্রদর্শিত হবে না। প্রথমত, আমি ভেবেছিলাম এটি একেবারে যুক্ত করা হয়নি (কোনও কারণে) তবে আমি (স্নুপ ব্যবহার করে) জানতে পেরেছিলাম যে এটি আসলে যুক্ত হয়েছে তবে এটির প্রকৃতপরিধি ছিল 0 (এটি স্বয়ংক্রিয় আকারের ছিল এবং স্পষ্টতই পুনরায় সেট হয়েছিল যখন কলামটি ছিল অপসারণ)। এখন, আমি আপনার কোডটি কলামগুলিতে পুনরায় যুক্ত করার পরে কলামটি সঠিক প্রস্থে সেট করার জন্য ব্যবহার করব। অনেক ধন্যবাদ!
গেহহ

আমার সমস্যার সহজ সমাধান!
Gqqnbig

+1 পারফেক্ট! এই উত্তর হিসাবে চিহ্নিত করা হয়েছে আশা করি। আমি এক্স: নাম = "জিভিসিমিওলোমনেম" কে এক্সএএমএল-তে যুক্ত করেছি যেখানে কলামটি সংজ্ঞায়িত করা হয়েছে যাতে আমি এটি পিছনের কোডটিতে অ্যাক্সেস করতে পারি। চ্যাম্পের মতো কাজ করে।
K0D4

19

যদি আপনার তালিকাভিউটিও পুনরায় মাপদণ্ডে থাকে তবে আপনি পূর্ণ তালিকাগুলির প্রস্থের সাথে মানিয়ে নিতে কলামগুলি পুনরায় আকার দিতে আচরণ বিন্যাসটি ব্যবহার করতে পারেন। আপনি গ্রিড কলাম সংজ্ঞা ব্যবহার করে প্রায় একই

<ListView HorizontalAlignment="Stretch"
          Behaviours:GridViewColumnResize.Enabled="True">
        <ListViewItem></ListViewItem>
        <ListView.View>
            <GridView>
                <GridViewColumn  Header="Column *"
                                   Behaviours:GridViewColumnResize.Width="*" >
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox HorizontalAlignment="Stretch" Text="Example1" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>

সোর্স কোড কিছু উদাহরণ জন্য নিম্নলিখিত লিঙ্ক এবং লিঙ্কটি দেখুন http://lazycowprojects.tumblr.com/post/7063214400/wpf-c-listview-column-width-auto


এই এক দুর্দান্ত। সমস্যাটি সমাধান করে এবং আপনি অনুসন্ধান করছেন এমন সমস্ত এন , এন , সরবরাহ করে।
ডিজাইনপটার্ন

এই আমি যা খুঁজছিলাম ছিল। : ডি
জ্যাক বার্গার

দ্রষ্টব্য: একটি বাগ রয়েছে বলে মনে হচ্ছে। যখন তালিকাটি উল্লম্বভাবে পুনরায় আকার দেওয়া হয়, এমন বিন্দুতে যে উল্লম্ব স্ক্রোলবারটি প্রদর্শিত হয়, স্ক্রোলবার অদৃশ্য না হওয়া অবধি কলামটি ধারাবাহিকভাবে প্রস্থে বৃদ্ধি পাবে।
জ্যাক বার্গার

4
এই পোস্টটি আমার আগের মন্তব্যে বর্ণিত আচরণের অন্তর্দৃষ্টি দিতে পারে।
জ্যাক বার্গার

এটি দুর্দান্ত, আমি কোড এবং সাইট উভয়ই বুঝি :)। আমি বিশ্বাস করি যখন আমার কঠোর প্রয়োজনীয়তা থাকবে তখন এটি কার্যকর হবে।
Gqqnbig

12

আমি নিম্নলিখিত ক্লাসটি তৈরি করেছি এবং যেখানেই প্রয়োজন হয় সেখানে অ্যাপ্লিকেশন জুড়ে ব্যবহার করেছি GridView:

/// <summary>
/// Represents a view mode that displays data items in columns for a System.Windows.Controls.ListView control with auto sized columns based on the column content     
/// </summary>
public class AutoSizedGridView : GridView
{        
    protected override void PrepareItem(ListViewItem item)
    {
        foreach (GridViewColumn column in Columns)
        {
            // Setting NaN for the column width automatically determines the required
            // width enough to hold the content completely.

            // If the width is NaN, first set it to ActualWidth temporarily.
            if (double.IsNaN(column.Width))
              column.Width = column.ActualWidth;

            // Finally, set the column with to NaN. This raises the property change
            // event and re computes the width.
            column.Width = double.NaN;              
        }            
        base.PrepareItem(item);
    }
}

7

যেহেতু আমার আইটেম কনটেনার স্টাইল ছিল তাই আমাকে আইটেম কনটেনার স্টাইলে হরাইজেন্টাল কনটেন্টএলাইনমেন্ট লাগাতে হয়েছিল

    <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=FieldDef.DispDetail, Mode=OneWay}" Value="False">
                         <Setter Property="Visibility" Value="Collapsed"/>
                    </DataTrigger>
                </Style.Triggers>
                <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
    ....

6

আমি ব্যবহারকারী 1333423 এর সমাধানটি সবসময় প্রতিটি কলামকেই আবার আকার দিতে পছন্দ করি না; আমার কিছু কলামকে প্রস্থের স্থির করা দরকার। সুতরাং এই সংস্করণে "অটো" এ প্রস্থের কলামগুলি স্বয়ংক্রিয় আকারের হবে এবং নির্দিষ্ট পরিমাণে সেট করা স্বয়ংক্রিয় আকারের হবে না।

public class AutoSizedGridView : GridView
{
    HashSet<int> _autoWidthColumns;

    protected override void PrepareItem(ListViewItem item)
    {
        if (_autoWidthColumns == null)
        {
            _autoWidthColumns = new HashSet<int>();

            foreach (var column in Columns)
            {
                if(double.IsNaN(column.Width))
                    _autoWidthColumns.Add(column.GetHashCode());
            }                
        }

        foreach (GridViewColumn column in Columns)
        {
            if (_autoWidthColumns.Contains(column.GetHashCode()))
            {
                if (double.IsNaN(column.Width))
                    column.Width = column.ActualWidth;

                column.Width = double.NaN;                    
            }          
        }

        base.PrepareItem(item);
    }        
}

2

আমি জানি যে এটি অনেক দেরি হয়ে গেছে তবে এখানে আমার পদ্ধতির বিষয়:

<GridViewColumn x:Name="GridHeaderLocalSize"  Width="100">      
<GridViewColumn.Header>
    <GridViewColumnHeader HorizontalContentAlignment="Right">
        <Grid Width="Auto" HorizontalAlignment="Right">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="100"/>
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Column="0" Text="Local size" TextAlignment="Right" Padding="0,0,5,0"/>
        </Grid>
    </GridViewColumnHeader>
</GridViewColumn.Header>
<GridViewColumn.CellTemplate>
    <DataTemplate>
        <TextBlock Width="{Binding ElementName=GridHeaderLocalSize, Path=Width, FallbackValue=100}"  HorizontalAlignment="Right" TextAlignment="Right" Padding="0,0,5,0" Text="Text" >
        </TextBlock>
    </DataTemplate>
</GridViewColumn.CellTemplate>

মূল ধারণাটি হ'ল গ্রিডকালাম কলামের প্রস্থের সেল সেলিমপ্লিট উপাদানটির প্রস্থকে আবদ্ধ করা। প্রস্থ = 100 প্রথম আকার পরিবর্তন না হওয়া অবধি ডিফল্ট প্রস্থ ব্যবহৃত হয়। এর পিছনে কোনও কোড নেই। সব কিছু এক্সএলএল এ।


এটি আমাকে একটি কলামের প্রস্থ পূরণ করার জন্য এই সমাধানে অনুপ্রাণিত করেছে: <গ্রিডভিউ কলম প্রস্থ = "inding বাঁধাই সম্পর্কিত সম্পর্কিত উত্স = {আপেক্ষিক উত্স পূর্বসূচী = তালিকাভিউ List, পথ = প্রকৃতপরিধি}">
জে অ্যান্ডারসেন

1

আমি গৃহীত উত্তরটি নিয়ে সমস্যায় পড়েছি (কারণ আমি অনুভূমিক অ্যালাইনমেন্ট = স্ট্র্যাচ অংশটি মিস করেছি এবং মূল উত্তরটি সামঞ্জস্য করেছি)।

এটি অন্য কৌশল। এটি একটি শেয়ারডসাইজগ্রুপ সহ গ্রিড ব্যবহার করে।

নোট: Grid.IsSharedScope সত্য = ListView উপর।

<Window x:Class="WpfApplication6.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
    <ListView Name="lstCustomers" ItemsSource="{Binding Path=Collection}" Grid.IsSharedSizeScope="True">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="ID" Width="40">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                             <Grid>
                                  <Grid.ColumnDefinitions>
                                       <ColumnDefinition Width="Auto" SharedSizeGroup="IdColumn"/>
                                  </Grid.ColumnDefinitions>
                                  <TextBlock HorizontalAlignment="Right" Text={Binding Path=Id}"/>
                             </Grid>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="First Name" DisplayMemberBinding="{Binding FirstName}" Width="Auto" />
                <GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding LastName}" Width="Auto"/>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>
</Window>

আপনার প্রস্থ আছে GridViewColumn যেমন 40এবং আপনাকে কলাম সংজ্ঞা প্রস্থ সেট Auto? এটা বোঝা যায় না।
বিকে

1

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

public void correctColumnWidths()
{
    double remainingSpace = myList.ActualWidth;

    if (remainingSpace > 0)
    {
         for (int i = 0; i < (myList.View as GridView).Columns.Count; i++)
              if (i != 2)
                   remainingSpace -= (myList.View as GridView).Columns[i].ActualWidth;

          //Leave 15 px free for scrollbar
          remainingSpace -= 15;

          (myList.View as GridView).Columns[2].Width = remainingSpace;
    }
}

0

এটি আপনার কোড

<ListView Name="lstCustomers" ItemsSource="{Binding Path=Collection}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="ID" DisplayMemberBinding="{Binding Id}" Width="40"/>
            <GridViewColumn Header="First Name" DisplayMemberBinding="{Binding FirstName}" Width="100" />
            <GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding LastName}"/>
        </GridView>
    </ListView.View>
</ListView>

এটা চেষ্টা কর

<ListView Name="lstCustomers" ItemsSource="{Binding Path=Collection}">
    <ListView.View>
        <GridView>
            <GridViewColumn DisplayMemberBinding="{Binding Id}" Width="Auto">
               <GridViewColumnHeader Content="ID" Width="Auto" />
            </GridViewColumn>
            <GridViewColumn DisplayMemberBinding="{Binding FirstName}" Width="Auto">
              <GridViewColumnHeader Content="First Name" Width="Auto" />
            </GridViewColumn>
            <GridViewColumn DisplayMemberBinding="{Binding LastName}" Width="Auto">
              <GridViewColumnHeader Content="Last Name" Width="Auto" />
            </GridViewColumn
        </GridView>
    </ListView.View>
</ListView>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.