我是 WinForms 的新手,正在嘗試制作一個以 DataGridView 樣式保存某些資料的應用程式。
現在我已經設法創建了應用程式,如果單擊一個單元格,則 TextBoxes 和 ComboBox 將填充來自 GridView 的資料,但我現在正在努力讓 DateTimePicker 做同樣的事情......
下面你會看到代碼我用來將資料呼叫回文本和組合框,但我錯過了對 DateTimePicker 的正確呼叫,我不知道如何正確呼叫它
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
index = e.RowIndex;
DataGridViewRow row = dataGridView1.Rows[index];
textBox1.Text = row.Cells[0].Value.ToString();
dateTimePicker1.Value = row.Cells[1].Value.ToString();
comboBox1.Text = row.Cells[2].Value.ToString();
textBox2.Text = row.Cells[3].Value.ToString();
}
我知道我無法將型別字串轉換為 System.DateTime,但我不知道該怎么做......
先感謝您。
uj5u.com熱心網友回復:
的型別
如果您想嘗試這種方法,請創建一個類來表示Row視圖中的 a。
class Record
{
public string Description { get; set; } = $"Item {autoName }";
public DateTime Date { get; set; } = DateTime.Now;
public CBValues Value { get; set; } = CBValues.Apple;
static char autoName = 'A';
}
enum CBValues
{
Apple,
Orange,
Banana,
}
接下來制作一個BindingList<Record>...
BindingList<Record> Records = new BindingList<Record>();
并在此初始化方法中將其設定為DataSource您DataGridView的,該方法還安裝自定義列(該類是從這個 Microsoft
如果您運行此代碼,您將看不到與所選行具有相同值的文本框和日期時間選擇器。我們仍然需要為控制元件添加“系結”代碼,如下所示……
private void Form1_Load(object sender, EventArgs e) {
GridDT = GetDataForGrid();
dataGridView1.DataSource = GridDT;
textBox1.DataBindings.Add("Text", GridDT, "First Name", true, DataSourceUpdateMode.OnPropertyChanged, "");
textBox2.DataBindings.Add("Text", GridDT, "Last Name", true, DataSourceUpdateMode.OnPropertyChanged, "");
dateTimePicker1.DataBindings.Add("Value", GridDT, "Hire Date", true, DataSourceUpdateMode.OnPropertyChanged, "");
}
這DataBindings.Add是不言自明的,但是可以在Control.DataBindings 屬性中找到檔案
如果您現在運行代碼,您會注意到當用戶在網格中選擇不同的行時,文本框的值會發生變化。還應該注意,這是一種“慢”的雙向系結。例子; 如果您更改“外部”名字文本框……那么您將不會“立即”在網格中看到此更改。根據您單擊的控制元件,更改可能不會反映在網格中。如果您單擊另一個文本框或按 Tab 鍵……更改可能不會顯示在網格中。
同樣的想法也適用于網格。如果用戶更改名字單元格中的文本,那么這些更改不會“立即”反映到“外部”文本框中,直到用戶在網格中選擇“不同”行。如果用戶按下 Tab 鍵或單擊同一行中的另一個單元格……那么更改將不會反映在外部文本框中。
從用戶的角度來看,這提出了一個小問題。IMO……我想至少在用戶編輯并將單元格留在網格中或用戶編輯并離開“外部”文本框時“看到”這些更改。為了解決這個問題,我將使用 aBindingSource而不是 aDataTable作為DataSource.
在我們切換到 之后BindingSource,您將看不到太大的變化,并且之前的問題仍然存在。但是,這將簡化我們對前一個問題的解決方案。1)我們將連接“外部”文本框Leave事件來執行BindingSources EndEdit()更新網格的方法。2) 我們將連接 gridsCellValueChanged事件來更新外部文本框。3)我們將使用日期時間選擇器Leave事件來做同樣的事情。
注意我對兩個文本框使用了相同的Leave事件。這些最終的變化如下......
BindingSource GridBS;
private void Form1_Load(object sender, EventArgs e) {
textBox1.Leave = new EventHandler(textBox_Leave);
textBox2.Leave = new EventHandler(textBox_Leave);
dateTimePicker1.Leave = new EventHandler(textBox_Leave);
dataGridView1.CellValueChanged = new DataGridViewCellEventHandler(dataGridView1_CellValueChanged);
GridBS = new BindingSource();
GridBS.DataSource = GetDataForGrid();
dataGridView1.DataSource = GridBS;
textBox1.DataBindings.Add("Text", GridBS, "First Name", true, DataSourceUpdateMode.OnPropertyChanged, "");
textBox2.DataBindings.Add("Text", GridBS, "Last Name", true, DataSourceUpdateMode.OnPropertyChanged, "");
dateTimePicker1.DataBindings.Add("Value", GridBS, "Hire Date", true, DataSourceUpdateMode.OnPropertyChanged, "");
}
private void textBox_Leave(object sender, EventArgs e) {
GridBS.EndEdit();
}
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) {
GridBS.EndEdit();
}
我希望這是有道理的并有所幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/493264.html
下一篇:如何更改禁用按鈕的前景色
