6

現在、高度な検索機能を備えたブックマーク マネージャー アプリケーション (Windows フォーム) に取り組んでいます。

クラスを作成しましLinksた。ユーザーが URL を入力するたびに、Link オブジェクトを作成し、そこに詳細を保存します。現在NameURLとのプロパティTagsTagsあります。 はリストです。

実行時にDataSourcegridview のプロパティをList<Links>オブジェクトに設定すると、Nameと がURL表示されますが、タグは表示されません

List<Links>オブジェクト内のタグのリストをグリッドビューに表示するにはどうすればよいですか?

編集:ちょうどアイデアがありました。List<Links>を に変換する関数を作成し、 のプロパティを にDataTable設定するとどうなるでしょうか。DataSourceDataGridDataTable

これの問題は、 に変更が加えられるたびに を再List<Links>生成する必要がDataTableあることです。これは、パフォーマンスの観点からは理想的ではないようです。

編集 2: リスト内の各項目を DataGridViewTextBox 列として表示したいと考えています。

ありがとう、

アビジート。

4

2 に答える 2

2

多分これはあなたが望むものです...それが実際に持っているより多くのプロパティを持っているように見えるオブジェクト。

DataGridViewcontrollは名前空間をサポートしているため、ComponentModel存在しないプロパティを持っているように見えるクラスを作成できます。これは、使用するのと同じメカニズムPropertyGridです。

サンプルコード

このサンプルは、完全に機能するWindowsフォームクラスであり、フォームに。が含まれていDataGridViewます。プロパティに設定されるリストを使用して、isにいくつかのオブジェクトを追加しDataSourceます。

そのリスト内のオブジェクトにはプロパティがまったくありません...しかし、それらはコンポーネントモデルを使用して「仮想」プロパティをに記述しますDataGridView

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            this.dataGridView1.Dock = DockStyle.Fill;
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            dataGridView1.DataSource = new List<MyClass>
                    {
                      new MyClass("value 1", "value 2", "value 3"),
                      new MyClass("value 1", "value 2"),
                    };
        }

        class MyClass : CustomTypeDescriptor
        {
            public MyClass(params string[] tags)
            {
                this.tags = new List<string>(tags);
            }

            public override PropertyDescriptorCollection GetProperties(Attribute[] attributes)
            {
                var listProps = new List<PropertyDescriptor>();

                // adding properties dynamically
                for (int i = 0; i < tags.Count; i++)
                    listProps.Add(new PropDesc("Tag" + i, i));

                return new PropertyDescriptorCollection(listProps.ToArray());
            }

            private List<string> tags = new List<string>();

            class PropDesc : PropertyDescriptor
            {
                private int index;

                public PropDesc(string propName, int index)
                    : base(propName, new Attribute[0])
                {
                    this.index = index;
                }

                public override bool CanResetValue(object component) { return false; }

                public override Type ComponentType { get { return typeof(MyClass); } }

                public override object GetValue(object component)
                {
                    if (index >= ((MyClass)component).tags.Count)
                        return null;

                    return ((MyClass)component).tags[index];
                }

                public override bool IsReadOnly { get { return true; } }

                public override Type PropertyType { get { return typeof(string); } }

                public override void ResetValue(object component) { }

                public override void SetValue(object component, object value) { }

                public override bool ShouldSerializeValue(object component) { return false; }
            }
        }

        private void InitializeComponent()
        {
            this.dataGridView1 = new DataGridView();
            ((ISupportInitialize)(this.dataGridView1)).BeginInit();
            this.SuspendLayout();
            // dataGridView1
            this.dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
            this.dataGridView1.Dock = DockStyle.Fill;
            this.dataGridView1.Location = new System.Drawing.Point(0, 0);
            this.dataGridView1.Name = "dataGridView1";
            this.dataGridView1.Size = new System.Drawing.Size(284, 262);
            this.dataGridView1.TabIndex = 1;
            // Form1
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(284, 262);
            this.Controls.Add(this.dataGridView1);
            this.Name = "Form1";
            this.Text = "Form1";
            ((ISupportInitialize)(this.dataGridView1)).EndInit();
            this.ResumeLayout(false);

        }

        private DataGridView dataGridView1;
    }
}
于 2012-10-25T23:18:10.707 に答える
0

WPF で作業している場合は、DataGridView 行詳細テンプレートを使用してみませんか? タグ リストとバインドする行の詳細テンプレートとして 2 番目のグリッドを使用できます。

于 2012-10-25T09:26:37.890 に答える