winforms 不含时间文字方块的日期时间C#(Winform)

xv8emn3q  于 2022-11-16  发布在  C#
关注(0)|答案(3)|浏览(477)

我正在学习代码,所以我有一个问题,我想显示日期从datagridview到textbox,但我不知道如何显示它没有时间.谢谢大家. enter image description here
代码我写txtDate.Text = dataGrid.Cells[2].Value.ToString();
我尝试了txtDate.Text = dataGrid.Cells[2].Value.ToString("DD/MM/YYYY");,它出现错误“方法”ToString“没有重载“。

  • 谢谢-谢谢
uqdfh47h

uqdfh47h1#

虽然不知道您的DataGridView是否设置了DataSource属性,但可以考虑使用BindingSource,将其DataSource设置为DataTableDataTable反过来又成为DataGridView的DataSource。这样做可以与实际DataGridView进行有限的交互。
现在,当您要将DateTime列值设置为TextBox时,请首先检查是否存在日期,如果存在有效日期,则检索该日期并设置值的格式。

public partial class StackoverFlowForm : Form
{
    private readonly BindingSource _bindingSource = new();
    private readonly string _dateFormat = "dd/MM/yyyy";
    public StackoverFlowForm()
    {
        InitializeComponent();

        _bindingSource.DataSource = Mocked.Table();
        dataGrid.DataSource = _bindingSource;
        dataGrid.Columns["DateItem"]!.DefaultCellStyle.Format = _dateFormat;
    }

    private void GetStartDateButton_Click(object sender, EventArgs e)
    {
        if (dataGrid.CurrentRow!.Cells["DateItem"].Value.IsNull())
        {
            txtDate.Text = "";
        }
        else
        {
            var dateTime = (((DataRowView)_bindingSource.Current)!)
                .Row.Field<DateTime>("DateItem");

            txtDate.Text = dateTime.ToString(_dateFormat);
        }
    }
}

#region Place these classes in separate files
public static class LanguageExtensions
{
    public static bool IsNull(this object sender)
        => sender == null || sender == DBNull.Value || Convert.IsDBNull(sender);
}
public class Mocked
{
    public static DataTable Table()
    {
        var dt = new DataTable();

        dt.Columns.Add(new DataColumn()
        {
            ColumnName = "Id",
            DataType = typeof(int),
            AutoIncrement = true,
            AutoIncrementSeed = 1,
            ColumnMapping = MappingType.Hidden
        });

        dt.Columns.Add(new DataColumn() { ColumnName = "FirstName", DataType = typeof(string) });
        dt.Columns.Add(new DataColumn() { ColumnName = "LastName", DataType = typeof(string) });
        dt.Columns.Add(new DataColumn() { ColumnName = "DateItem", DataType = typeof(DateTime) });

        dt.Rows.Add(null, "Jeanine", "Abbott",
            new DateTime(2018, 2, 12, 8, 0, 0));
        dt.Rows.Add(null, "Lester", "Lam",
            new DateTime(2018, 9, 8, 9, 0, 0));
        dt.Rows.Add(null, "Claire", "Cowan",
            new DateTime(2018, 1, 1, 10, 0, 0));
        dt.Rows.Add(null, "Karen", "Payne",
            new DateTime(2022, 1, 1, 10, 0, 0));

        return dt;
    }
} 
#endregion

有一个提到使用DateOnly,但没有增益。

private void GetStartDateButton_Click(object sender, EventArgs e)
{
    if (dataGrid.CurrentRow!.Cells["DateItem"].Value.IsNull())
    {
        txtDate.Text = "";
    }
    else
    {
        var dateTime = (((DataRowView)_bindingSource.Current)!)
            .Row.Field<DateTime>("DateItem");

        txtDate.Text = DateOnly.FromDateTime(dateTime).ToString(_dateFormat);
    }
}
llew8vvj

llew8vvj2#

您尝试套用的ToString方法多载不存在于字串上。
必须首先将初始字符串转换为DateTime,如下所示:

if(!string.IsNullOrWhiteSpace(dataGrid.Cells[2].Value.ToString()) && DateTime.TryParse(dataGrid.Cells[2].Value.ToString(), out DateTime date))
{
         txtDate.Text = date.ToString("dd/MM/yyyy");
}

ToString的重载可通过将格式

kupeojn6

kupeojn63#

您可以尝试使用DateOnly。
https://learn.microsoft.com/en-us/dotnet/api/system.dateonly?view=net-6.0
或者使用以下命令将其转换为所需格式输出的字符串:
目标字符串(日/月/年)

相关问题