gpt4 book ai didi

c# - 如何以不同的形式将文本框数据传递给数据 GridView

转载 作者:行者123 更新时间:2023-11-30 23:32:15 25 4
gpt4 key购买 nike

我有两种形式:

第一个表单(XML 数据加载器)包含一个具有六列(名称、宽度、高度、长度、自重、负载容量)的 DataGridView

XML Data Loader 上还有一个按钮,按下该按钮会打开一个新窗体窗口(添加新汽车)。Add New Car 有六个文本框,用户可以在其中输入火车车厢数据。

目标是让用户能够单击“添加新车”上的“保存”按钮,数据将被推送到 XML 数据加载器上的 DataGridView 中的新行中,但我在实际寻找方法时遇到了问题去做这个。我发现的所有其他内容都假定 DataGridViews 是通过数据库填充的,但我的是用户输入填充的。


public partial class XMLDataLoader : Form
{
public XMLDataLoader()
{
InitializeComponent();
}

private void buttonAddCar_Click(object sender, EventArgs e)
{
AddNewCar addNewCar = new AddNewCar();
addNewCar.Show();
}
}

enter image description here

public partial class AddNewCar : Form
{
public AddNewCar()
{
InitializeComponent();
}

private void buttonNewSave_Click(object sender, EventArgs e)
{
//Check that all textboxes have some kind of entry
//ToDo: check the type of data so that only numbers are entered into non-name categories
if(textBoxNewName.TextLength < 1)
{
MessageBox.Show("Please enter a train name!");
}
if (textBoxNewWidth.TextLength < 1)
{
MessageBox.Show("Please enter a train width!");
}
if (textBoxNewHeight.TextLength < 1)
{
MessageBox.Show("Please enter a train height!");
}
if (textBoxNewLength.TextLength < 1)
{
MessageBox.Show("Please enter a train length!");
}
if (textBoxNewDeadWeight.TextLength < 1)
{
MessageBox.Show("Please enter a train dead weight!");
}
if (textBoxNewLoadCapacity.TextLength < 1)
{
MessageBox.Show("Please enter a train load capacity!");
}

//Save all data input by user to create a new train momentarily
var newTrainName = textBoxNewName.Text;
var newTrainWidth = textBoxNewWidth.Text;
var newTrainHeight = textBoxNewHeight.Text;
var newTrainLength = textBoxNewLength.Text;
var newTrainDeadWeight = textBoxNewDeadWeight.Text;
var newTrainLoadCapacity = textBoxNewLoadCapacity.Text;
}
}

enter image description here

最佳答案

首先,使用 ShowDialog() 而不是 Show()。这样,当 AddNewCar 对话框关闭时,您仍会在 buttonAddCar_Click 中。您的代码现在的方式是,buttonAddCar_Click 将退出,而 AddNewCar 仍然可见,并且您的主窗口将失去与 AddNewCar 实例的所有联系> 你创造的。

其次,您需要向调用者公开文本框值。因此在对话框关闭后,addNewCar.textBoxNewName.Text 将包含用户在新名称 TextBox 中键入的字符串。但默认情况下,这不是公开的。所以添加一堆属性来公开值:

public String NewName { get { return textBoxNewName.Text; } }

在调用 ShowDialog() 之后的 buttonAddCar_Click 中,您可以对所有这些 TextBox 的公开的 Text 属性做任何您喜欢的事情。

我现在不是每天都做winforms,所以textBoxNewName.Text如果在表单关闭后触摸它可能会抛出异常。轻松修复!将公共(public)属性声明为常规属性而不是只获取访问器...

public String NewName { get; protected set; }

...并在用户输入通过验证后在 OK click 事件中为它们分配值。这是我们的下一个话题。

最后,让用户连续(可能)点击六个弹出窗口足以让他自杀。相反,我建议声明一个名为 message 的字符串变量并连接:

    string message = "";
if(textBoxNewName.TextLength < 1)
{
message += "Please enter a train name!\n"
}
if (textBoxNewWidth.TextLength < 1)
{
message += "Please enter a train width!\n";
}

// ...etc....

if (!String.IsNullOrWhiteSpace(message))
{
MessageBox.Show(message);
}
else
{
NewName = textBoxNewName.Text;
// ...and so on for the other five properties.

// This will close the form and cause ShowDialog() to
// return DialogResult.OK
DialogResult = DialogResult.OK;
}

Form.DialogResult is Form.ShowDialog() 的有用附件。

如果您有一个取消按钮,它甚至不需要 Click 方法。只需设置 Button's DialogResult property到表单设计器中的 DialogResult.Cancel,当用户单击它时,它会将该值分配给 Form.DialogResult,这将导致窗口关闭并 ShowDialog 返回 DialogResult.Cancel

另一种方法是声明一个简单的类,其中包含所有汽车创建数据:NewNameWidth 等。编写 ShowDialog() 返回该类型,或者引用该类型并返回 bool(true 表示 OK)。如果用户取消,则返回 null 或 false;如果用户单击“确定”并通过验证,它会返回该类的一个实例,或者在引用版本中,填充传入的引用的成员,然后返回 true。

如果您已经有一个表示 Car 的类(来自 Entity Framework 或其他),您可以直接使用它。

但我上面描述的方式与内置 WinForms 对话框(如 FileOpen 等)的用法一致。在 WinForms、MFC、WPF 等任何环境中工作时,我的试金石是框架会做什么?这几乎总是正确的答案,因为 a) 成功的框架往往设计合理(它们被无法访问其内部结构或咨询其实现者的人成功使用),并且 b) 与您的代码交互的任何人都将确切地知道会发生什么,因为他已经知道框架的做事方式。

每次我使用自认为比框架更聪明的第三方代码时,我都忍不住注意到它是多么愚蠢。

关于c# - 如何以不同的形式将文本框数据传递给数据 GridView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34360841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com