2013-07-16 3 views
0

C#, и я не буду лучшим другом в ближайшем будущем, но я стараюсь изо всех сил: D Что я пытаюсь do, что я хочу получить некоторые атрибуты с соответствующими значениями из некоторых диаграмм, а затем записать их в некоторые формы окон. Я хоть об одной SplitPanel. С левой стороны я хотел добавить для каждого атрибута метку и справа, для значения текстовое поле. Обычно я предполагаю, что метка также сделает это, но на втором этапе я хочу, чтобы oppurtunity изменил значения, записав новое значение в текстовое поле. Но в будущем, прежде всего, я хочу получить значения в панели. Получение значений не проблема, но следующий шаг вызывает у меня большие проблемы. Кроме того, у меня есть две кнопки, одна для получения значений из диаграммы и одна для внесения в конечном итоге изменений. В настоящее время submitButton не подходит.Передача значений на SplitPanel и добавление для каждого значения нового ярлыка/текстового поля в C#

[valueChanger.jpg] [1]

Я предполагаю, что код говорит больше, чем 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();*/ 
    } 

Часть с TextWriter I isnerted только для проверки правильности выхода.

Теперь код-позади Форме:

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#. В общем, я довольно новичок в C#. Моя проблема может быть тривиальной, но это заставило меня потеть весь день. Я не ожидаю полного ответа с кодом и всем остальным. О подсказках и подсказках я был бы очень доволен.

+0

Не могли бы вы быть точным с вашей проблемой? – Ehsan

ответ

1

Ваша проблема заключается в том, просто, каждый контейнер (как 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; 
    } 
} 
+0

Благодарю вас за ответ, я проверю его, но на первый взгляд он выглядит хорошо. Приносит больше света в тень :) – Alika87

+0

Привет, я попробовал ваш код. Я добавил метод AddEntry в FormClass и Rest в projectClass. Я все еще перебираю одиночные атрибуты и вызываю метод AddEntry. Но я получаю ошибку CS0103, так как имя «AddEntry» отсутствует в реальном контексте. Логично, что эти ошибки возникают, но как я могу это исправить? Есть ли какая-нибудь команда, которую мне нужно добавить? – Alika87

+0

@ Alika87 Какое точное исключение? весь код, который я написал в моем ответе, должен быть помещен в один и тот же «класс». –

0

Не окончательный ответ, но у меня недостаточно репутации, чтобы прокомментировать разъяснения.

Я думаю, что ваша структура неверна, вы должны иметь пару циклов внутри события GetButton_Click, чтобы перебирать значения, которые вы извлекаете из источника, а затем помещать пары ярлыков/текстовых полей в ваш SPlitContainer.

Событие краски может срабатывать по любому случаю, поэтому не должно быть ничего большего, чем форматирование.

Если вы новичок в Winforms, вы не знаете о DataGridView, для этого точного сценария, вы должны узнать :)

+0

спасибо за ваш совет, я посмотрю в DataGridView, я действительно очень новичок в Winforms. – Alika87

0

Я пишу надстройку для архитектуры предприятия, код ниже является частью основного класса:

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. Я искал более часа, но не смог найти причину этого исключения.

+0

Какова строка, в которой выбрано 'NullReferenceException'? –

+0

Исключение исходит от архитектора предприятия. Это говорит мне, в каком методе это исключение. В этом случае это в случае «& Изменить значения». – Alika87

+0

У вашего конструктора 'ChangeValues ​​()' что-то не так. Все 'Application.xxxx' должны быть помещены в статический метод' Main' в файле 'Program.cs'. Ваш код должен вызывать 'StackOverflowException', но похоже, что это не так (потому что вы не упомянули об этом). –

 Смежные вопросы

  • Нет связанных вопросов^_^