C#中将DataGridView日期值传入RichTextBox如何去除多余时间部分
问题原因
你直接读取dataGridView1.Rows[i].Cells[j].Value取到的是数据库返回的原生DateTime类型值,默认调用ToString()会携带默认的时间部分。你在DataGridView上看到的格式是控件渲染层的格式设置,不会修改底层Value的原始值。
可行解决方案
下面给出3种可直接落地的方案,按需选择即可:
方案1:循环写入时单独格式化日期列(改代码量最小)
直接在循环里判断如果是第一列(索引0),就把值转为DateTime后按你要的格式输出,同时兼容空值场景,修改Form1_Load里的循环逻辑即可:
private void Form1_Load(object sender, EventArgs e) { dataGridView1.DataSource = SelectData(); // 提前设置日期列的格式,保证DataGridView显示正常 dataGridView1.Columns[0].DefaultCellStyle.Format = "MM/dd/yyyy"; richTextBox1.Text = "REPORT \n\n"; for (int i = 0; i <= dataGridView1.Rows.Count - 1; i++) { // 跳过空白行(如果DataGridView允许用户新增行的话) if (dataGridView1.Rows[i].IsNewRow) continue; richTextBox1.Text += "-"; for (int j = 0; j < dataGridView1.Columns.Count; j++) { string cellText; if (j == 0 && dataGridView1.Rows[i].Cells[j].Value != DBNull.Value) { // 第一列是日期,单独格式化 DateTime dateVal = Convert.ToDateTime(dataGridView1.Rows[i].Cells[j].Value); cellText = dateVal.ToString("MM/dd/yyyy"); } else { cellText = dataGridView1.Rows[i].Cells[j].Value?.ToString() ?? ""; } richTextBox1.Text += $"\t{cellText}\t"; } richTextBox1.Text += "\n"; } }
方案2:直接取DataGridView已经格式化好的显示值
不需要额外判断类型,直接取控件渲染后显示的文本,和你在DataGridView上看到的内容完全一致,把循环里取Value的部分换成FormattedValue即可:
// 替换原代码中的 dataGridView1.Rows[i].Cells[j].Value.ToString() dataGridView1.Rows[i].Cells[j].FormattedValue.ToString()
方案3:在SQL查询阶段直接返回格式化后的日期字符串
修改SelectData方法里的查询语句,用MySQL内置函数直接把日期转为你要的格式,后续不需要再做任何处理:
SELECT DATE_FORMAT(date, '%m/%d/%Y') as date, name FROM person
这种方案读出来的date字段就是字符串类型,直接ToString就会输出MM/dd/yyyy格式的内容,不会携带时间。
内容的提问来源于stack exchange,提问作者arch1
相关产品推荐
相关产品推荐

