C#如何从DataGridView控件数据,转成获取DataTable。

Jave.Lin 2009-07-10 10:39:25
如题。

有没有现成的方法。

虽然自己写是可以实现。
...全文
8585 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZZ 2011-11-02
  • 打赏
  • 举报
回复
14楼方法不错
honker斌 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 piaoshuai 的回复:]

強制轉換撒
C# code

public DataTable GetDgvToTable(DataGridView dgv)
{
DataTable dt = new DataTable();
for (int count = 0; count < dgv.Columns.Count; count++)
……
[/Quote]

膜拜一下!
fuyu84752222 2010-12-23
  • 打赏
  • 举报
回复
toString 去掉就好了,未将对象引用设置到对象实例"的报错属于系统不够智能
mindy1123 2010-12-09
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 piaoshuai 的回复:]
強制轉換撒

C# code

public DataTable GetDgvToTable(DataGridView dgv)
{
DataTable dt = new DataTable();
for (int count = 0; count < dgv.Columns.Count; count++)
……
[/Quote]
强制转换大哥太牛X了,帮了大忙!可是"未将对象引用设置到对象实例"的报错原因是什么了?能否指点下!
piaoshuai 2010-10-25
  • 打赏
  • 举报
回复
強制轉換撒

public DataTable GetDgvToTable(DataGridView dgv)
{
DataTable dt = new DataTable();
for (int count = 0; count < dgv.Columns.Count; count++)
{
DataColumn dc = new DataColumn(dgv.Columns[count].Name.ToString());
dt.Columns.Add(dc);
}
for (int count = 0; count < dgv.Rows.Count; count++)
{
DataRow dr = dt.NewRow();
for (int countsub = 0; countsub < dgv.Columns.Count; countsub++)
{
dr[countsub] = Convert.ToString(dgv.Rows[count].Cells[countsub].Value);
}
dt.Rows.Add(dr);
}
return dt;
}
Mo_Myth 2010-10-03
  • 打赏
  • 举报
回复
ToSting()去掉就可以了
ljgwhmh01 2009-12-02
  • 打赏
  • 举报
回复
不对,减一的话就少了一列的值。
aideng 2009-10-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 maths_bai 的回复:]
引用 3 楼 libinguest 的回复:
昨天刚写的


///  <summary>
        /// 方法实现把dgv里的数据完整的复制到一张内存表
        ///  </summary>
        ///  <param name="dgv">dgv控件作为参数 </param>
        ///  <returns>返回临时内存表 </returns>
        public static DataTable GetDgvToTable(DataGridView dgv)
        {
            DataTable dt=new DataTable();
            for (int count = 0; count  < dgv.Columns.Count; count++)
            {
                DataColumn dc = new DataColumn(dgv.Columns[count].Name.ToString());
                dt.Columns.Add(dc);
            }
            for (int count = 0; count  < dgv.Rows.Count; count++)
            {
                DataRow dr = dt.NewRow();
                for (int countsub = 0; countsub  < dgv.Columns.Count-1; countsub++)
                {
                    dr[countsub] = dgv.Rows[count].Cells[countsub].Value.ToString();
                }
                dt.Rows.Add(dr);
            }
            return dt;
        }


编译通过,运行有异常:
  dr[countsub] = dgv.Rows[count].Cells[countsub].Value.ToString();
  未将对象引用设置到对象的实例。



[/Quote]


减1就可以了
风之影子 2009-07-10
  • 打赏
  • 举报
回复
楼主:如果你的数据在dgv里经过处理了,那就得循环
如3楼所写。
如果没有,也就没有此贴了
dean615 2009-07-10
  • 打赏
  • 举报
回复
如果你绑定数据时,是用DATATABLE绑定的可以直接转换出来,
DataTable datatTable =DataGridView.DataSource as DataTable
或者DataTable datatTable = (DataTable)DataGridView.DataSource
但是如果不是直接绑定的,就要自己写了
fafasun 2009-07-10
  • 打赏
  • 举报
回复
如果直接数据绑定的话,直接

DataTable dt = (datagridview.DataSource as DataTable);

表结构和数据都过去了。
itliyi 2009-07-10
  • 打赏
  • 举报
回复
DataTable t=DataGridView1.DataSource as DataTable
lsj_zrp 2009-07-10
  • 打赏
  • 举报
回复
如果你的datagridview是绑定数据源的,还比较好处理
如果没有绑定,好像还真的循环了
风之影子 2009-07-10
  • 打赏
  • 举报
回复
昨天刚写的


/// <summary>
/// 方法实现把dgv里的数据完整的复制到一张内存表
/// </summary>
/// <param name="dgv">dgv控件作为参数</param>
/// <returns>返回临时内存表</returns>
public static DataTable GetDgvToTable(DataGridView dgv)
{
DataTable dt=new DataTable();
for (int count = 0; count < dgv.Columns.Count; count++)
{
DataColumn dc = new DataColumn(dgv.Columns[count].Name.ToString());
dt.Columns.Add(dc);
}
for (int count = 0; count < dgv.Rows.Count; count++)
{
DataRow dr = dt.NewRow();
for (int countsub = 0; countsub < dgv.Columns.Count; countsub++)
{
dr[countsub] = dgv.Rows[count].Cells[countsub].Value.ToString();
}
dt.Rows.Add(dr);
}
return dt;
}
King0113 2009-07-10
  • 打赏
  • 举报
回复
如果有分页的话还貌似不行吧...
冬冬V 2009-07-10
  • 打赏
  • 举报
回复
就得自己写哥们,哎,同情!
你怎么写的
if (e.Row.Cells[2].Text == "1")//获取权限的值是1还是2,方便用汉字来显示
{
e.Row.Cells[2].Text = "普通管理员";
}
else
{
e.Row.Cells[2].Text = "超级管理员";
}
我刚做的你转换下 好像就行 看看吧
yangshenghong 2009-07-10
  • 打赏
  • 举报
回复
用正则吧
Maths_bai 2009-07-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 libinguest 的回复:]
昨天刚写的


/// <summary>
        /// 方法实现把dgv里的数据完整的复制到一张内存表
        /// </summary>
        /// <param name="dgv">dgv控件作为参数 </param>
        /// <returns>返回临时内存表 </returns>
        public static DataTable GetDgvToTable(DataGridView dgv)
        {
            DataTable dt=new DataTable();
            for (int count = 0; count < dgv.Columns.Count; count++)
            {
                DataColumn dc = new DataColumn(dgv.Columns[count].Name.ToString());
                dt.Columns.Add(dc);
            }
            for (int count = 0; count < dgv.Rows.Count; count++)
            {
                DataRow dr = dt.NewRow();
                for (int countsub = 0; countsub < dgv.Columns.Count; countsub++)
                {
                    dr[countsub] = dgv.Rows[count].Cells[countsub].Value.ToString();
                }
                dt.Rows.Add(dr);
            }
            return dt;
        }
[/Quote]

编译通过,运行有异常:
dr[countsub] = dgv.Rows[count].Cells[countsub].Value.ToString();
未将对象引用设置到对象的实例。





注意:本3.0版控件过于老旧,该控件最新版本为4.7版,您可以到http://myyouping.download.csdn.net/免费下载,也是完全免费的,没有任何功能及使用时间限制,0积分下载。我将3.0版控件的下载分提为10分,是希望大家使用最新版的控件控件特色: 1、超强大的DataGridView打印功能,不光可以以多种形式(普通打印、分栏打印、跨页打印、工资条打印)打印DataGridView表格,基本上能完全按DataGridView控件本身设置的格式如字体、字号、背景颜色、前景颜色、单元格对齐方式等打印出来,文字图像都可以打印,而且是完全根据表格当前的显示顺序进行打印的,如果您在使用时调整了列的顺序,刷新打印后就会按调整后的列显示顺序进行打印(这是网上很多DataGridView打印控件没有实现的),基本上做到了所见即所得的打印。 2、强大的文本打印输出功能,打印文本时,如果需要,控件会自动换行或换页打印输出。 3、支持同一文档多种版面格式打印(类似于Word中的节的功能):对同一份文档,不同的页面可以设置不同的格式(纸张大小、纸张方向、页边距),只需要在新增一页时在NewPage方法中指定要使用的页面格式即可,使用非常简单。 4、报表功能。本控件允许将当前打印预览的内容保存为报表文件,以后使用本控件重新打开该报表文件即可重现原来保存报表时的打印内容。 5、打印方案保存与读取功能。可以将当前打印参数保存为打印方案文件,或都从保存的打印方案文件中读取打印参数。 6、水印功能。根据需要,可以在页面中打印或不打印以半透明空心文字打印水印。 7、特殊文字效果功能。本版控件具有打印浮雕文字、阴影文字、空心文字、块文字的功能,效果非常不错。 8、页眉页脚中既可打印文字,也可打印图像,或者即打印图像又打印输出文字。 9、图像打印输出功能。 本控件包括两个打印组件:DGVprint打印组件与VB2008print打印组件。VB2008Print为通用打印控件(为可视化组件),可以混合打印一个或多个DataGridView表格、DataGrid表格与文字、图片等内容;而DGVprint是以VB2008Print为基础开发的(为非可视化组件),为专用的表格打印控件,可以很方便打印单个DatatGridview、DataGrid、DataTable表格的内容,并提供打印时的可视化设置界面,可设置表格打印方式(普通打印、分栏打印、跨页打印、工资条打印)、标题内容及字体、页眉页脚、选择要打印的表格列、列顺序调整及列格式设置、更改列标题名称等,使用非常方便,功能非常强大。 与本控件的上一个版本2.1版相比,本版控件新增功能如下: VB2008Print打印组件新增功能: 1、多种特效文字打印输出功能,能打印的特效文字有 空心文字、浮雕文字、块文字、阴影文字等。 2、水印打印功能。可以在面页中以半透明空心文字的形式打印背景水印,只需要简单设置控件的WaterMarkText等几个以WaterMark开头的属性即可,程序会自动打印水印。 3、PrintDGV函数可直接使用DGVPrint组件保存的打印方案文件打印输出DataGridView表格, 4、在页眉页脚中不光可以打印文本,还可以打印图像,文本与图像可同时打印(即在图像上显示文本)。此外,页眉页脚文字可以换行打印了,页面的左边也右边距也可以打印内容了(调用相应的函数PrintLeft与PrintRight实现)。 5、改进DrawText函数输出文本的功能,现在,即便调用没有指定打印区域或打印宽度的DrawText函数输出文本,打印输出时控件也会智能换行和换页(原版本是需要指定打印宽度才能自动换行换页打印的) 6、改进DrawImage与DrawCellImage输出图像功能,如果图像比较小(小于打印区域大小),可以不进行放大打印。(但如果图像大于打印区域的话,还是采用整体缩小打印,而不是区域剪裁打印)。 7、增加IsShowPrintStatusDialog属性,指示在发送到打印机打印时,是否显示一个指示正在打印的状态窗口(可以取消打印),为TRUE表示要显示,为False表示不显示。 8、改进页眉页脚事件,将原来的HeaderOut与FooterOut统一为HeaderFooterOut事件,在该事件中,您可以调用PrintFooter、PrintHeader、PrintLeft、PrintRight函数分别打印上下左右的页眉。(PrintLeft与PrintRight函数为新增加的,用于在左边与右边页边距处输出内容) DGVPrint打印组件新增功能: 1、打印方案保存与读取功能。本版控件可以将您的可视化设置(包括列格式设置等)全部保存为打印方案文件(文本文件,您可以用记事本打开并修改),并有读取方案文件的功能,不再需要每次都进行打印格式设置了,一劳永逸! 2、直接调用打印方案文件打印功能。您不光可以设计DGVPrint打印组件的属性来进行打印,还可以直接调用DGVPrint组件中保存的打印方案文件,直接利用保存的方案文件的参数进行打印预览输出。 3、新增在可视化打印参数设置界面的列标题重命名功能,可能修改列标题要打印的名字。 4、水印打印功能。如果水印文本设置为空,则不打印水印。 5、导出数据成Excel功能。暂未提供该功能的函数接口,只在打印参数设置窗口中增加了一个数据导出的按钮,可以将当前要打印的DataGridView的内容导出成Excel文件。该功能以后会进一步完善。 6、在进行页眉页脚文本设置时,可以用 [页码] 代表要输出的当前页码,用 [总页数] 代表要输出总页数,控件在进行输出时,会自动将其转换为对应的页码与文档总页数。

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧