В 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);
Вам действительно нужен список объектов, которые имеют строковое свойство. С .NET 3.5 вы можете обмануть:
.DataSource = list.Select(x=>new {Value = x}).ToList();
В противном случае создайте фиктивный класс и скопируйте данные вручную ...
Это связано с тем, что 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();
}