关于“未将对象引用到设置对象的实例”错误

DreamClub 2007-11-13 04:16:05
关于“未将对象引用到设置对象的实例”错误

下面这段代码是参照csdn上的一篇关于将datagridview里显示自定义控件的方法写的,功能是将返回表格的第4列显示为一个combox控件。
但是,每次执行都会提示这个错误,我实验从工具箱中拖出一个combox控件命名为cmb而不是使用ComboxBox cmb = new ComboxBox();的方法,这样combox就能狗正确显示了,遗憾的是位置不是正好和单元格重叠,而是在距离单元格上面。
调试也看不出那里的问题。
出错代码如下:
public partial class ADD : Form
{
private System.Windows.Forms.ComboBox cmb = new System.Windows.Forms.ComboBox();
public string _conn = System.Configuration.ConfigurationManager.AppSettings["connstr"];
public ADD()
{
InitializeComponent();
}

private void Serach_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection(_conn);
SqlCommand cmd = new SqlCommand("NormalSelect",conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@MC",SqlDbType.NVarChar);
cmd.Parameters["@MC"].Value = textBox1.Text;
SqlDataAdapter sa = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
sa.Fill(dt);
this.bindingSource1.DataSource = dt;
this.dataGridView1.DataSource = bindingSource1;
}

private void dataGridView1_CurrentCellChanged(object sender, EventArgs e)
{
try
{
if (this.dataGridView1.CurrentCell.ColumnIndex == 3)
{
Rectangle rect = this.dataGridView1.GetCellDisplayRectangle(dataGridView1.CurrentCell.ColumnIndex, dataGridView1.CurrentCell.RowIndex,true);
string cellstr = this.dataGridView1.CurrentCell.Value.ToString();
if (cellstr == "Overdue") cmb.Text = "过期";
else if (cellstr == "Accept") cmb.Text = "生效";
cmb.Left = rect.Left;
cmb.Top = rect.Top;
cmb.Width = rect.Width;
cmb.Height = rect.Height;
cmb.Visible = true;


}
else
{
cmb.Visible = false;
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);

}

}
private void cmbinit()
{
DataTable dataT = new DataTable();
DataRow DataR;
dataT.Columns.Add("flag");
dataT.Columns.Add("display");
DataR = dataT.NewRow();
DataR[0] = "Overdue";
DataR[1] = "过期";
dataT.Rows.Add(DataR);
DataR = dataT.NewRow();
DataR[0] = "Accept";
DataR[1] = "生效";
dataT.Rows.Add(DataR);

this.cmb.ValueMember = "flag";
this.cmb.DisplayMember = "display";
this.cmb.DataSource = dataT;
this.cmb.DropDownStyle = ComboBoxStyle.DropDownList;
this.cmb.Location = new System.Drawing.Point(130, 117);

}

private void ADD_Load(object sender, EventArgs e)
{
cmbinit();
this.cmb.Visible = false;
this.cmb.SelectedIndexChanged += new EventHandler(cmb_SelectedIndexChanged);

}
private void cmb_SelectedIndexChanged(object sender, EventArgs e)
{
if (((ComboBox)sender).Text == "过期")
{
this.dataGridView1.CurrentCell.Value = "过期";
this.dataGridView1.CurrentCell.Tag = "Overdue";
}
else
{
this.dataGridView1.CurrentCell.Value = "生效";
this.dataGridView1.CurrentCell.Tag = "Accept";
}
}

}
...全文
230 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序猿 2007-11-14
  • 打赏
  • 举报
回复
进来分点分
DreamClub 2007-11-14
  • 打赏
  • 举报
回复
经过我昨天自己慢慢调试,终于明白问题出到那里了。

在参考的KissyougoodBye的blog里,关于CurrentCellChanged的事件是这样写的:

private void dgv_User_CurrentCellChanged(object sender, EventArgs e)
{
try
{
if (this.dgv_User.CurrentCell.ColumnIndex == 2)
{
Rectangle rect = dgv_User.GetCellDisplayRectangle(dgv_User.CurrentCell.ColumnIndex, dgv_User.CurrentCell.RowIndex, false);
string sexValue = dgv_User.CurrentCell.Value.ToString();
if (sexValue == "1")
{
cmb_Temp.Text = "男";
}
else
{
cmb_Temp.Text = "女";
}
cmb_Temp.Left = rect.Left;
cmb_Temp.Top = rect.Top;
cmb_Temp.Width = rect.Width;
cmb_Temp.Height = rect.Height;
cmb_Temp.Visible = true;
}
else
{
cmb_Temp.Visible = false;
}
}
catch
{
}
}
我也是模仿了这样来写,唯一不同的是catch段,问题的关键其实是出在
Rectangle rect = dgv_User.GetCellDisplayRectangle(dgv_User.CurrentCell.ColumnIndex, dgv_User.CurrentCell.RowIndex, false);
这一句上。
我在事件的起始处设置了一个断点,发现CurrentCellChanged事件并非是用户改变当前单元格才会发生的,在DataGridview控件绑定数据源完成开始填充数据的第一行第一列之前,就会引发一个CurrentCellChanged事件,而这个时候,CurrentCell还没有被显示出来,所以,就会抛出一个“未将对象引用到设置对象的实例”错误,而在KissyougoodBye兄提供的源码中的catch段是空白的,这个错误被忽略了,所以不显示。似乎是没有错误。我后来写的代码段中加入了对异常的处理,故而困惑了良久.......,哈哈,解决了。准备散分,分不多意思一下,进者有分咯
DreamClub 2007-11-13
  • 打赏
  • 举报
回复
我怀疑是combox控件出了问题,但是实在找不出问题在那里,反正每次都显示“未将对象引用到设置对象的实例”
代码是参考
http://blog.csdn.net/kissyougoodby/archive/2007/09/12/1782550.aspx


harryheart 2007-11-13
  • 打赏
  • 举报
回复
错误在哪?具体点...
Date 对象属性constructor 返回对创建此对象的 Date 函数的引用。prototype 使您有能力向对象添加属性和方法。Date 对象方法getDate() 从 Date 对象返回一个月中的某一天 (1 ~ 31)。getDay() 从 Date 对象返回一周中的某一天 (0 ~ 6)。getFullYear() 从 Date 对象以四位数字返回年份。getHours() 返回 Date 对象的小时 (0 ~ 23)。getMilliseconds() 返回 Date 对象的毫秒(0 ~ 999)。getMinutes() 返回 Date 对象的分钟 (0 ~ 59)。getMonth() 从 Date 对象返回月份 (0 ~ 11)。getSeconds() 返回 Date 对象的秒数 (0 ~ 59)。getTime() 返回 1970 年 1 月 1 日至今的毫秒数。getTimezoneOffset() 返回本地时间与格林威治标准时间 (GMT) 的分钟差。getUTCDate() 根据世界时从 Date 对象返回月中的一天 (1 ~ 31)。getUTCDay() 根据世界时从 Date 对象返回周中的一天 (0 ~ 6)。getUTCFullYear() 根据世界时从 Date 对象返回四位数的年份。getUTCHours() 根据世界时返回 Date 对象的小时 (0 ~ 23)。getUTCMilliseconds() 根据世界时返回 Date 对象的毫秒(0 ~ 999)。getUTCMinutes() 根据世界时返回 Date 对象的分钟 (0 ~ 59)。getUTCMonth() 根据世界时从 Date 对象返回月份 (0 ~ 11)。getUTCSeconds() 根据世界时返回 Date 对象的秒钟 (0 ~ 59)。getYear() 已废弃。 请使用 getFullYear() 方法代替。parse() 返回1970年1月1日午夜到指定日期(字符串)的毫秒数。setDate() 设置 Date 对象中月的某一天 (1 ~ 31)。setFullYear() 设置 Date 对象中的年份(四位数字)。setHours() 设置 Date 对象中的小时 (0 ~ 23)。setMilliseconds() 设置 Date 对象中的毫秒 (0 ~ 999)。setMinutes() 设置 Date 对象中的分钟 (0 ~ 59)。setMonth() 设置 Date 对象中月份 (0 ~ 11)。setSeconds() 设置 Date 对象中的秒钟 (0 ~ 59)。setTime() setTime() 方法以毫秒设置 Date 对象。setUTCDate() 根据世界时设置 Date 对象中月份的一天 (1 ~ 31)。setUTCFullYear() 根据世界时设置 Date 对象中的年份(四位数字)。setUTCHours() 根据世界时设置 Date 对象中的小时 (0 ~ 23)。setUTCMilliseconds() 根据世界时设置 Date 对象中的毫秒 (0 ~ 999)。setUTCMinutes() 根据世界时设置 Date 对象中的分钟 (0 ~ 59)。setUTCMonth() 根据世界时设置 Date 对象中的月份 (0 ~ 11)。setUTCSeconds() setUTCSeconds() 方法用于根据世界时 (UTC) 设置指定时间的秒字段。setYear() 已废弃。请使用 setFullYear() 方法代替。toDateString() 把 Date 对象的日期部分转换为字符串。toGMTString() 已废弃。请使用 toUTCString() 方法代替。toISOString() 使用 ISO 标准返回字符串的日期格式。toJSON() 以 JSON 数据格式返回日期字符串。toLocaleDateString() 根据本地时间格式,把 Date 对象的日期部分转换为字符串。toLocaleTimeString() 根据本地时间格式,把 Date 对象的时间部分转换为字符串。toLocaleString() 据本地时间格式,把 Date 对象转换为字符串。toString() 把 Date 对象转换为字符串。toTimeString() 把 Date 对象的时间部分转换为字符串。toUTCString() 根据世界时,把 Date 对象转换为字符串。UTC() 根据世界时返回 1970 年 1 月 1 日 到指定日期的毫秒数。valueOf() 返回 Date 对象的原始值。

110,536

社区成员

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

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

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