请教DataGridView增加新行问题 在datatable中添加row,然后重新绑定到grid 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 datatable dt = dgv.datasource as datatabledatarow dr = dt.newRow()dt.rows.add(dr);dgv.datasource = dt; 用下面的语句试过, 没有什么反应. 执行了. 可是不见东西. 行还是那么多行. DataTable dt = dv.DataSource as DataTable; DataRow dr = dt.NewRow(); dt.Rows.Add(dr); rowNo = dt.Rows.Count - 1;dv.DataSource = dt; 你如果没有别的代码控制,新行是不会消失的.是否选择行改变事件里重新绑定了数据源?而且绑定datatable后,修改datatable,表格会自动跟着变,不需要再次绑定. 在DataGridView的单元格中启用换行 private void Frm_Main_Load(object sender, EventArgs e) { dgv_Message.DataSource = new List<Fruit>() {//绑定数据集合 new Fruit(){Name="鲤鱼",Price=30}, new Fruit(){Name="鲶鱼",Price=40}, new Fruit(){Name="泥鳅",Price=33}, new Fruit(){Name="白鲢鱼白鲢鱼白鲢鱼白鲢鱼白鲢鱼白鲢鱼白鲢鱼白鲢鱼白鲢鱼白鲢鱼" ,Price=31}};//CodeGo.net/ dgv_Message.Columns[0].Width = 200;//设置列宽度 dgv_Message.Columns[1].Width = 170;//设置列宽度 dgv_Message.Columns[0].DefaultCellStyle.Alignment =//设置对齐方式 DataGridViewContentAlignment.MiddleCenter; dgv_Message.DefaultCellStyle.WrapMode = //换行显示过长文本内容 DataGridViewTriState.True; dgv_Message.Rows[3].Height = 30;//设置行高度 } 我没有做任何处理. 全部代码在这里:第一种情况: 我直接在多出的新行中输入资料, 光标移到其他行后该新行自动消失. 第二种情况: 点击button1, 没有反应. 实际跟踪代码是执行了的. 重不重新绑定都是一样. using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using Common;namespace ErpCore{ public partial class wf_invt_saveqty : Form { public wf_invt_saveqty() { InitializeComponent(); } protected override void OnLoad(EventArgs e) { base.OnLoad(e); int id = tv_1.AddNode(null, "type","物料类型", "%"); tv_1.AddNodes( "GetItemType", "type_Name", "type",tv_1.Nodes[id]); tv_1.AddChildNode(tv_1.Nodes[id], 1, "GetPaperType", "name", "code"); GetInvtSaveQty(); } private void GetInvtSaveQty() { DataTable dt = DBUtility.ReportSQL.GetInvtSaveQty("%", "%"); dv_1.DataSource = dt; dv_1.AutoSetHeaderText("invt_saveqty"); dv_1.Columns["itemtype"].Visible = false; dv_1.Columns["papertype"].Visible = false; dv_1.Columns["id"].Visible = false; string[] noeditcols = { "userid","inputdate"}; ShowRowNumber(); } private void ShowRowNumber() { for (int i = 0; i < dv_1.RowCount; i++) { dv_1.Rows[i].HeaderCell.Value = (i+1).ToString(); } } private void tv_1_AfterSelect(object sender, TreeViewEventArgs e) { DataTable dt = dv_1.DataSource as DataTable ; DataView dv = dt.DefaultView; if (e.Node is Common.TreeViewItem) { Common.TreeViewItem item = e.Node as Common.TreeViewItem ; string type = item.GetItem("type"); string code = item.GetItem("code"); if (type == string.Empty) type = "%"; if (code == string.Empty) code = "%"; dv.RowFilter = "itemtype like '" + type + "' and papertype like '" + code + "'"; ShowRowNumber(); } } private void button1_Click(object sender, EventArgs e) { // dv_1.AddRow(); DataTable dt = dv_1.DataSource as DataTable; DataRow dr = dt.NewRow(); dt.Rows.Add(dr); int rowNo = dt.Rows.Count - 1; // dv.DataSource = null ; //dv_1.DataSource = dt; } private void button2_Click(object sender, EventArgs e) { DataTable dt = dv_1.DataSource as DataTable; string info = DBUtility.DbHelper.Update(dt, DBUtility.UpdateWhereClause.BykeyOnly); MessageBox.Show(info); } }} 你列什么都没添加当然是空行啊DataTable dt = dgv.DataSource as DataTable;DataRow dr = dt.NewRow();dr["列名"] = "你的数据";dt.Rows.Add(dr);dgvt.DataSource = dt; 唉, 不是这个问题, 有空行不怕, 问题是当在空行中输入资料后, 光标移走后, 这一行又没了. 就算上面代码我加上了 dr["itemtype"] = "A"; dr["papertype"] = "B";也是一样不行的 你把dt定义成全局的,然后后面全部去访问dt而不是用完销毁,再用又上dgv.DataSource里去找.还有ShowRowNumber();里面代码到底是什么,每次AfterSelect都执行 不好意思,看漏了,显示行号的代码应该没问题.你先把AfterSelect里的代码去掉,再试.只能是这里有问题 说实话dv.RowFilter = "itemtype like '" + type + "' and papertype like '" + code + "'";这个到底要干什么我完全没看懂dv排完序就丢弃了,没有绑定回表格上 急,,,如何给html下拉列表绑定一项所有 请教个控件Attributes的问题 多线程如何访问界面上的某一个控件,并返回控件的值! 学C#介绍几本好书 关于EMPPLib.dll的问题 我的代码测试没有问题,数据怎么不能写入数据库呀,奇怪郁闷?? 大伙儿好!向大家征求个网站名称! 请教:Activex显示问题 高分讨教:如何让两个可执行文件按顺序执行,而不是同时运行? 怎么将listview或listview的选项传递到已打开的窗口控件 C# 程序与windows系统服务的交互。 DeleteButton.visible=!DeleteButton.visible;
datarow dr = dt.newRow()
dt.rows.add(dr);
dgv.datasource = dt;
DataTable dt = dv.DataSource as DataTable;
DataRow dr = dt.NewRow();
dt.Rows.Add(dr);
rowNo = dt.Rows.Count - 1;
dv.DataSource = dt;
是否选择行改变事件里重新绑定了数据源?而且绑定datatable后,修改datatable,表格会自动跟着变,不需要再次绑定.
private void Frm_Main_Load(object sender, EventArgs e)
{
dgv_Message.DataSource = new List<Fruit>() {//绑定数据集合
new Fruit(){Name="鲤鱼",Price=30},
new Fruit(){Name="鲶鱼",Price=40},
new Fruit(){Name="泥鳅",Price=33},
new Fruit(){Name="白鲢鱼白鲢鱼白鲢鱼白鲢鱼白鲢鱼白鲢鱼白鲢鱼白鲢鱼白鲢鱼白鲢鱼"
,Price=31}};//CodeGo.net/
dgv_Message.Columns[0].Width = 200;//设置列宽度
dgv_Message.Columns[1].Width = 170;//设置列宽度
dgv_Message.Columns[0].DefaultCellStyle.Alignment =//设置对齐方式
DataGridViewContentAlignment.MiddleCenter;
dgv_Message.DefaultCellStyle.WrapMode = //换行显示过长文本内容
DataGridViewTriState.True;
dgv_Message.Rows[3].Height = 30;//设置行高度
}
第一种情况: 我直接在多出的新行中输入资料, 光标移到其他行后该新行自动消失.
第二种情况: 点击button1, 没有反应. 实际跟踪代码是执行了的. 重不重新绑定都是一样. using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Common;
namespace ErpCore
{
public partial class wf_invt_saveqty : Form
{
public wf_invt_saveqty()
{
InitializeComponent();
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
int id = tv_1.AddNode(null, "type","物料类型", "%");
tv_1.AddNodes( "GetItemType", "type_Name", "type",tv_1.Nodes[id]);
tv_1.AddChildNode(tv_1.Nodes[id], 1, "GetPaperType", "name", "code");
GetInvtSaveQty();
}
private void GetInvtSaveQty()
{
DataTable dt = DBUtility.ReportSQL.GetInvtSaveQty("%", "%");
dv_1.DataSource = dt;
dv_1.AutoSetHeaderText("invt_saveqty");
dv_1.Columns["itemtype"].Visible = false;
dv_1.Columns["papertype"].Visible = false;
dv_1.Columns["id"].Visible = false;
string[] noeditcols = { "userid","inputdate"};
ShowRowNumber();
} private void ShowRowNumber()
{
for (int i = 0; i < dv_1.RowCount; i++)
{
dv_1.Rows[i].HeaderCell.Value = (i+1).ToString();
}
} private void tv_1_AfterSelect(object sender, TreeViewEventArgs e)
{
DataTable dt = dv_1.DataSource as DataTable ;
DataView dv = dt.DefaultView;
if (e.Node is Common.TreeViewItem)
{
Common.TreeViewItem item = e.Node as Common.TreeViewItem ;
string type = item.GetItem("type");
string code = item.GetItem("code");
if (type == string.Empty) type = "%";
if (code == string.Empty) code = "%";
dv.RowFilter = "itemtype like '" + type + "' and papertype like '" + code + "'";
ShowRowNumber();
} } private void button1_Click(object sender, EventArgs e)
{
// dv_1.AddRow();
DataTable dt = dv_1.DataSource as DataTable;
DataRow dr = dt.NewRow();
dt.Rows.Add(dr);
int rowNo = dt.Rows.Count - 1;
// dv.DataSource = null ;
//dv_1.DataSource = dt; } private void button2_Click(object sender, EventArgs e)
{
DataTable dt = dv_1.DataSource as DataTable;
string info = DBUtility.DbHelper.Update(dt, DBUtility.UpdateWhereClause.BykeyOnly);
MessageBox.Show(info);
}
}
}
DataRow dr = dt.NewRow();
dr["列名"] = "你的数据";
dt.Rows.Add(dr);
dgvt.DataSource = dt;
就算上面代码我加上了
dr["itemtype"] = "A";
dr["papertype"] = "B";
也是一样不行的
而不是用完销毁,再用又上dgv.DataSource里去找.还有ShowRowNumber();里面代码到底是什么,每次AfterSelect都执行
你先把AfterSelect里的代码去掉,再试.
只能是这里有问题
dv排完序就丢弃了,没有绑定回表格上