1

さて、基本的に私はC#を初めて使用し、現在eコマースソフトウェアを開発する会社で働いており、解決できない問題を抱えています。

2 つの列があり、チェック ボックスのリストを表示する 3 番目の列を追加したいのですが、他の 2 つ (または 1 つ) のフィールドに何らかの形式のデータが表示されている場合にのみ、これらのチェックボックスを表示したい、IE:

            Name Type Check
            lol   lol

また、これらのチェック ボックスが自動的にオンになるようにします。

もう1つの問題は、チェックしたときに製品が検索に表示されるようにしたいのですが、チェックを外した場合は非表示にして削除しないようにしたいということです。

まだ何も知らないSQLデータベースと通信するため、既存のものの残りを書き直す必要がないため、現在GridViewを使用しています。

私たちは ASP を使用しておらず、XAML と C# を使用しています (どちらも私はほとんど知識がありません)。

4

2 に答える 2

0

これは、過去に各 datagridview 行のチェックボックスを作成するために使用したものです...次に、 datagridview_cellcontentclick イベントハンドラーを使用して、クリックされたときにチェックボックスの値を変更します。以下のコードのコンテキストでは、プログラム名、ウィンドウ タイトル、および開いているファイルまたは URL で構成されるカスタム クラスがあります。次に、カスタム カストラクタ タイプのグローバル リスト「oplist」を作成しました。次に、リストの項目を datagridview に追加するときに、列ヘッダーを指定しました。その後、datagridview に何かを追加または削除することが非常に簡単になります。リストから項目を削除または追加してから、datagridview を更新するだけです。

    public void addOpenProgramsToDataGrid()
    {
        dataGridView1.ColumnCount = 3;

        DataGridViewCheckBoxColumn column = new DataGridViewCheckBoxColumn();
        {
            column.HeaderText = "Selected";
            column.Name = "Selected";
            column.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
            column.FlatStyle = FlatStyle.Standard;
            column.ThreeState = false;
            column.CellTemplate = new DataGridViewCheckBoxCell();
            column.CellTemplate.Style.BackColor = Color.White;
        }

        dataGridView1.Columns.Insert(0, column); // This is to be a checkbox column
        dataGridView1.Columns[0].HeaderText = "X";


        dataGridView1.Columns[1].HeaderText = "Process Name:";

        dataGridView1.Columns[2].HeaderText = "Window Title";
        dataGridView1.Columns[3].HeaderText = "Open File or URL";

        dataGridView1.RowCount = opList.Count;
        //opList.RemoveRange(0, opList.Count);
        for (int a = 0; a < opList.Count; a++)
        {
            openProgram tempProgram = new openProgram();
            tempProgram = opList[a];
            dataGridView1.Rows[a].Cells[0].Value = true;

            dataGridView1.Rows[a].Cells[1].Value = tempProgram.processName;
            dataGridView1.Rows[a].Cells[2].Value = tempProgram.windowTitle;
            dataGridView1.Rows[a].Cells[3].Value = tempProgram.openFileOrURL;
        }
        selectAllCheckBox.Checked = true;
    }
于 2012-05-16T01:48:39.923 に答える
0

あなたの質問は非常に広く、答えるのがやや難しいです。つまり、見たいVisibilityのはコントロールのプロパティです。

に設定VisibilityするCollapsedと、UI は要素を表示しません。Visibility必要に応じて、別の XAML 要素またはデータ要素の値に基づいて 設定できますが、変換を行うには IValueConverter を実装するクラスを実装する必要があります。

値コンバーターの中で最も一般的なものの 1 つは、「ブール値から可視性へ」のコンバーターです。インターネットで検索すると、これらの例を見つけることができます。そのアプローチをコピーして、「EmptyToVisibilityConverter」または「NullToVisibilityConverter」など、必要なものを作成できます。そのコンバーターを取得したら、可視性のバインディングで指定するだけです。例えば:

<Page.Resources>
    <conv:NullToVisibilityConverter x:Key="NullToVis"/>
</Page.Resources>

<CheckBox ... Checked={Binding ThisBoxIsChecked} 
              Visibility={Binding SomeOtherValue, 
                          Converter={StaticResource NullToVis}}"/>

コントロールのコンテンツと可視性プロパティの間のデータバインディングは同じである必要はないことに注意してください。コンテンツを 1 つの値にバインドし、可視性を別の値にバインドできます。

データバインディングを使用していない場合は、分離コードでこれらを設定する必要があります。しかし、なぜデータバインディングを使用しないのでしょうか?

編集:これは実際の例です。

これがあなたが探しているものではない場合、私は鈍感で質問を理解していません

空のプロジェクトを開始し、これをそれに投入し、少し遊んでセットアップ方法の感触をつかむことをお勧めします。XAML の学習曲線は比較的急勾配であり、必要なことを達成するには通常 2 つの方法がありますが、データ バインディングと INotifyPropertyChanged (この例では触れませんでした) の基本的な理解が本当に必要です。

C# コードは次のとおりです。

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace CheckboxList
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            //Create a viewmodel and add some data to it.
            var viewModel = new MyViewModel();
            viewModel.Items.Add(new Data() {Name = "lol", Type = "lol", Selected = true});
            viewModel.Items.Add(new Data() { Name = "lol", Type = "not_lol", Selected = true });
            viewModel.Items.Add(new Data() { Name = "not_lol", Type = "not_lol", Selected = true });

            //Set the window's datacontext to the ViewModel.  This will make binding work.
            this.DataContext = viewModel;

        }
    }

    //This is the ViewModel used to bind your data 
    public class MyViewModel 
    {
        //This could just be a List<Data> but ObservableCollection<T> will automatically
        //update your UI when items are added or removed from the collection.
        public ObservableCollection<Data> Items { get; set; }

        public MyViewModel()
        {
            Items = new ObservableCollection<Data>();
        }
    }

    //Just a sample class to hold the data for the grid.
    //This is the class that is contained in the ObservableColleciton in the ViewModel
    public class Data
    {
        public string Name { get; set; }
        public string Type { get; set; }
        public bool Selected { get; set; }
    }


    //This is an example converter.  It looks to see if the element is set to "lol" 
    //If so, it returns Visibility.Collapsed.  Otherwise, it returns Visibility.Visible.
    public class LolToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null && value is string)
            {
                var input = (string) value;
                if (string.Equals(input, "lol", StringComparison.CurrentCultureIgnoreCase))
                {
                    return Visibility.Collapsed;
                }
                else
                {
                    return Visibility.Visible;
                }
            }

            return Visibility.Visible;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

そしてXAML:

<Window x:Class="CheckboxList.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:CheckboxList="clr-namespace:CheckboxList"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <!-- Create an instance of LolToVisibilityConverter and call it "LolToVis" -->
        <CheckboxList:LolToVisibilityConverter x:Key="LolToVis"/>
    </Window.Resources>
    <Grid>

        <ListView ItemsSource="{Binding Items}">  <!--Bind the contents of the Items collection in our viewmodel -->
            <ListView.View>
                <GridView>
                    <GridViewColumn Width="140" Header="Name" DisplayMemberBinding="{Binding Name}"/> <!-- bind this element to this column-->
                    <GridViewColumn Width="140" Header="Type" DisplayMemberBinding="{Binding Type}"/> <!-- bind this element to this column-->
                    <GridViewColumn Width="140" Header="Selected" >  <!-- because we don't want this to just display true/false, we need to set up a template-->
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <!-- we set the Visibility property to Name, and the converter to LolToVis-->
                                <!-- whenever this field will be displayed, it calls the converter to convert the string to a Visibility value-->
                                <!-- The visibility value is checked to determine whether or not the element should be displayed-->
                                <CheckBox IsChecked="{Binding Selected}" Visibility="{Binding Name, Converter={StaticResource LolToVis}}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
</Window>
于 2012-05-15T18:43:48.340 に答える