C#和我在不久的将来不会成为最好的朋友,但我正在努力做到最好:我想做的是,我想从一些图表中获得一些具有相关值的属性,然后将其写入到一些windows窗体中。我想大概有一个SplitPanel。在左边,我想为每个属性添加一个标签,在右边,为值添加一个文本框。通常我猜标签也能做到这一点,但在第二步,我想让oppurtunity通过将新值写入文本框来更改这些值。但那是很久以后的事了,首先我想把值放到面板里。获取值没有问题,但下一步会给我带来很大的问题。此外,我还有两个按钮,一个用于从图表中获取值,另一个用于最终提交更改。submitButton目前并没有太大的意义。
我猜一个代码会告诉1000多个单词,所以到目前为止我做了以下工作:
string Attributes;
string Values;
string tag;
tag = "";
Attributes = "";
Values = "";
foreach (EA.Element theElement in myPackage.Elements)
{
foreach (EA.Attribute theAttribute in theElement.Attributes)
{
Attributes = theAttribute.Name.ToString();
Values = theAttribute.Default.ToString();
tag = tag + Attributes + Values + Environment.NewLine;
}
/*TextWriter writer = new StreamWriter(myPackage.Name.ToString() + ".txt");
writer.WriteLine(tag.ToString());
writer.Close();*/
}我使用纹理写入器的部分只是为了检查输出是否为right...it。
现在是表单的代码隐藏部分:
public partial class ValueChanger : Form
{
public ValueChanger()
{
InitializeComponent();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new ValueChanger());
}
public void splitContainer1_Panel1_Paint(object sender,System.Windows.Forms.PaintEventArgs e)
{
Label Alabel = new Label();
Alabel.Text = Attributes.ToString();
}
public void splitContainer1_Panel2_Paint(object sender, PaintEventArgs e)
{
TextBox Box = new TextBox();
Box.Text = Values.ToString();
}
/*private void SubmitButton_Click(object sender, EventArgs e)
{
}*/
private void GetButton_Click(object sender, EventArgs e)
{
}对于GetButton,我尝试了不同的选择,但没有取得任何进展。只是无法访问属性和值。这是我第一次用C#处理windows窗体。总的来说,我对C#还是个新手。我的问题可能是微不足道的,但它让我整个下午都在冒汗。我不期望一个完整的答案与代码和一切。关于提示和提示,我会很高兴的。
发布于 2013-07-17 00:20:33
您的问题实际上很简单,每个容器(如Panel)都有一个名为Controls的属性,要将控件显示为容器的子控件,必须将该控件添加到容器中。以下是您可能需要的代码的简化版本:
private void AddEntry(string attribute, string value){
Label lbl = new Label {Text=attribute, Dock=DockStyle.Top};
lbl.Parent = splitContainer1.Panel1;//This is the same to splitContainer1.Panel1.Controls.Add(lbl);
lbl.BringToFront();
TextBox txt = new TextBox {Text=value, Dock=DockStyle.Top};
txt.Parent = splitContainer1.Panel2;
txt.BringToFront();
lbl.Height = txt.Height;
}
//I guess you want to add new entry to your splitContainer in this foreach
foreach (EA.Element theElement in myPackage.Elements)
{
foreach (EA.Attribute theAttribute in theElement.Attributes)
{
Attributes = theAttribute.Name.ToString();
Values = theAttribute.Default.ToString();
//call the method above
AddEntry(Attributes, Values);
tag = tag + Attributes + Values + Environment.NewLine;
}
}发布于 2013-07-17 00:02:54
不是一个明确的答案,但我还没有足够的声誉来评论澄清。
我认为您的结构是错误的,您应该在GetButton_Click事件中使用两个循环来遍历从源代码获取的值,然后将成对的标签/文本框放入您的SPlitContainer中。
paint事件可以在任何情况下触发,所以除了格式化之外,不应该做任何其他事情。
如果你是Winforms的新手,你不会知道DataGridView,对于这个场景,你应该学习:)
发布于 2013-07-18 23:26:53
我正在为企业架构师编写一个插件,下面的代码是主类的一部分:
case "&Change Values":
string attribute;
string value;
attribute = "";
value = "";
ChangeValues c = new ChangeValues();
foreach (EA.Element theElement in myPackage.Elements)
{
foreach (EA.Attribute theAttribute in theElement.Attributes)
{
attribute = theAttribute.Name.ToString();
value = theAttribute.Default.ToString();
c.AddEntry(attribute, value);
}
}
break;这是winform的代码:
public ChangeValues()
{
InitializeComponent();
//dataGridView1.Dock = DockStyle.Fill;
ChangeValues.ActiveForm.Activate();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new ChangeValues());
Application.SetCompatibleTextRenderingDefault(false);
}
public void AddEntry(string attribute, string value)
{
Label lbl = new Label { Text = attribute, Dock = DockStyle.Top };
lbl.Parent = splitContainer1.Panel1;//This is the same to splitContainer1.Panel1.Controls.Add(lbl);
lbl.BringToFront();
TextBox txt = new TextBox { Text = value, Dock = DockStyle.Top };
txt.Parent = splitContainer1.Panel2;
txt.BringToFront();
lbl.Height = txt.Height;
}
private void ChangeValues_Load(object sender, EventArgs e)
{
}当我尝试启动外接程序时,我得到一个NullReferenceException。我找了一个多小时,但没有找到这个异常的原因。
https://stackoverflow.com/questions/17681121
复制相似问题