如何重新绑定已与数据表绑定的Listview

时间:2013-04-10 08:35:50

标签: c# asp.net

我的Listview DataTableDataSource。现在我想用Generic列表重新绑定它。之后,Listview数据,DataTable和通用列表数据都将保留。有可能吗?

DataTable绑定Listview有3条记录。 现在我在Listview之外有一个添加按钮,我在添加按钮上的通用列表中添加一条新记录单击,然后我暂时想要显示这个新记录和`Listview1。最后,我在点击FinalSubmit上添加了这条新记录。

1 个答案:

答案 0 :(得分:0)

如果我理解这一点你想要组合两种不同的数据类型并基本上将它们合并为一个,那么你可以将ListView与它绑定在一起吗?

如果是这样,您必须将两者合并为SINGLE类型。您可以使用以下代码将您的通用列表转换为DataTable(扩展方法)。

    /// <summary>
/// Provides extensions to System.Linq object. 
/// </summary>
public static class LinqExtensions
{
    #region Methods

    /// <summary>
    /// Returns the underlying core type for a given type.
    /// </summary>
    /// <param name="typ">Type to evaluate.</param>
    /// <returns>Type.</returns>
    private static Type GetCoreType(Type typ)
    {
        if (typ != null && IsNullable(typ))
        {
            if (!typ.IsValueType)
            {
                return typ;
            }
            else
            {
                return Nullable.GetUnderlyingType(typ);
            }
        }
        else
        {
            return typ;
        }
    }

    /// <summary>
    /// Determines whether the type provided is nullable.
    /// </summary>
    /// <param name="typ">Type to evaluate.</param>
    /// <returns>True if is nullable else false.</returns>
    private static bool IsNullable(Type typ)
    {
        return !typ.IsValueType || (typ.IsGenericType && typ.GetGenericTypeDefinition() == typeof(Nullable<>));
    }

    /// <summary>
    /// Converts a generic list of type T into a data table.
    /// </summary>
    /// <typeparam name="T">The type the list consists of.</typeparam>
    /// <param name="items">Generic list being extended.</param>
    /// <returns>DataTable representing the strongly typed list.</returns>
    public static DataTable ToDataTable<T>(this Collection<T> items)
    {
        if (!object.Equals(items, null))
        {
            using (DataTable data = new DataTable(typeof(T).Name))
            {
                data.Locale = System.Globalization.CultureInfo.CurrentCulture;
                PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

                foreach (PropertyInfo prop in properties)
                {
                    data.Columns.Add(prop.Name, GetCoreType(prop.PropertyType));
                }
                foreach (T item in items)
                {
                    object[] values = new object[properties.Length];

                    for (int i = 0; i < properties.Length; i++)
                    {
                        values[i] = properties[i].GetValue(item, null);
                    }
                    data.Rows.Add(values);
                }
                return data;
            }
        }
        return null;
    }

    #endregion
}

然后,您可以使用.Merge()方法将两个数据表合并在一起。