.NET / C#, Связывающий IList <строка> с DataGridView

В jQuery нет удобной функции для этого. Вам нужно объединить contents(), который даст только дочерние узлы, но включает в себя текстовые узлы, с find(), который даст все элементы-потомки, но не текстовые узлы. Вот что я придумала:

var getTextNodesIn = function(el) {
    return $(el).find(":not(iframe)").addBack().contents().filter(function() {
        return this.nodeType == 3;
    });
};

getTextNodesIn(el);

Примечание. Если вы используете jQuery 1.7 или более раннюю версию, приведенный выше код не будет работать. Чтобы исправить это, замените addBack() на andSelf() . andSelf() не рекомендуется в пользу addBack() с 1,8 года.

Это несколько неэффективно по сравнению с методами чистого DOM и должно включать уродливый обходной путь для перегрузки jQuery его функции contents() (спасибо @rabidsnail в комментариях за указание на это), поэтому здесь не решение JQuery с использованием простой рекурсивной функции. Параметр includeWhitespaceNodes управляет включением в вывод пробельных текстовых узлов (в jQuery они автоматически отфильтровываются).

Обновление: исправлена ​​ошибка, когда includeWhitespaceNodes ложно.

function getTextNodesIn(node, includeWhitespaceNodes) {
    var textNodes = [], nonWhitespaceMatcher = /\S/;

    function getTextNodes(node) {
        if (node.nodeType == 3) {
            if (includeWhitespaceNodes || nonWhitespaceMatcher.test(node.nodeValue)) {
                textNodes.push(node);
            }
        } else {
            for (var i = 0, len = node.childNodes.length; i < len; ++i) {
                getTextNodes(node.childNodes[i]);
            }
        }
    }

    getTextNodes(node);
    return textNodes;
}

getTextNodesIn(el);

7
задан Marc Gravell 9 July 2009 в 14:59
поделиться

2 ответа

Вам действительно нужен список объектов, которые имеют строковое свойство. С .NET 3.5 вы можете обмануть:

.DataSource = list.Select(x=>new {Value = x}).ToList();

В противном случае создайте фиктивный класс и скопируйте данные вручную ...

13
ответ дан 6 December 2019 в 14:07
поделиться

Это связано с тем, что DataGridViews показывают свойства объекта. В этом случае у списка есть только одно свойство «Длина», поэтому он может отображать только «Длина» (независимо от типа данных). Вам нужно создать класс-оболочку для достижения того, что вы хотите (класс «MyString» со свойством «Text», затем отобразить список в вашей сетке).

Надеюсь, это поможет

Добавление примера кода

 class MyString
    {
        private string _text;
        public string Text
        { get 
             { 
              return _text; 
             }
            set 
            {
                _text = value; 
            }
        }

    }

] 'В исполняемой форме

 private List<MyString> foo()
        {
            List<MyString> lst = new List<MyString>();
            MyString one = new MyString();
            MyString two = new MyString();
            one.Text = "Hello";
            two.Text = "Goodbye";
            lst.Add(one);
            lst.Add(two);
            return lst;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            dataGridView1.DataSource = foo();

        }
2
ответ дан 6 December 2019 в 14:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: