C# Windows 窗体 - 在 xml 文件中的一个变量中分配文本框中的文本
本文关键字:文本 一个 变量 分配 Windows xml 文件 窗体 | 更新日期: 2023-09-27 18:31:43
我一直在用C#的Windows Forms应用程序中运行我的Phing构建文件的任务。
当我单击该按钮时,它会执行phing buildfile(运行cmd),将控制台输出保存到txt文件中,并在一个文本框中显示输出。
问题是我有一些需要用户输入的任务,例如需要用户输入提交消息的 SVN 提交。
当我执行提交任务时,显示一个空的cmd供用户编写提交消息,但没有显示问题,因此用户必须猜测他期望在控制台中写入的内容。
我创建了一个带有问题和用户答案文本框的输入框,但是如何将文本框中的文本分配给 xml 文件中的变量?很抱歉有一些英语错误...
编辑:
在我的构建文件中,我有这个:
<target name="commit" description="Executa Commit">
<propertyprompt propertyName="commit_message" defaultValue="Actualizado atraves do Phing"
promptText="Introduza a mensagem do Commit: " />
<svncommit
svnpath="${svn_path}"
workingcopy="${local_dir}"
message="${commit_message} " />
<echo msg="Revisao do Commit numero: ${svn.committedrevision}"/>
</target>
因此,它显示了消息"Introduza a mensagem do Commit",并将答案分配给commit_message。在 C# 中,我有一个输入框,我希望文本框中的文本是 xml 文件中"commit_message"的值
为卡米尔编辑:
textBox1.Clear();
var startInfo = new ProcessStartInfo("phing");
startInfo.WorkingDirectory = @"C:'wamp'bin'php'php5.4.3";
startInfo.Arguments = "commit > log.txt";
string pergunta = inputbox.InputBox("Qual é a mensagem do Commit ?", "Commit", "Mensagem Commit");
// textBox1.Text = "Escreva o caminho de origem da pasta:";
Process proc = Process.Start(startInfo);
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardInput = true;
proc.WaitForExit();
using (StreamReader sr = new StreamReader(@"C:'wamp'bin'php'php5.4.3'log.txt"))
{
textBox1.Text = sr.ReadToEnd();
}
将数字 2 编辑为 Kamil:
这种方式有效,但结果与这样做相同
var startInfo = new ProcessStartInfo("phing");
startInfo.WorkingDirectory = @"C:'wamp'bin'php'php5.4.3";
startInfo.Arguments = "commit ";
Process proc = Process.Start(startInfo);
我的老板告诉我,这样没有问题,只是想补充一件事。当控制台关闭时,我想将所有控制台输出发送到一个文本框,或者只是强制控制台保持打开状态,直到我关闭它
Process.OutputDataReceived
事件来获取"问题"(我假设来自cmd脚本)。
如果要将数据输入到应用程序(cmd?)输入 - 则必须使用Process.StandardInput.WriteLine()
方法。
您没有发布 C# 代码,我不知道您是使用 Process
来启动 cmd 脚本还是什么。
稍后编辑/添加:
textBox1.Clear();
var startInfo = new ProcessStartInfo("phing");
startInfo.WorkingDirectory = @"C:'wamp'bin'php'php5.4.3";
// startInfo.Arguments = "commit > log.txt"; // DONT PUT OUTPUT TO FILE
startInfo.Arguments = "commit"; // we will read output with event
string pergunta = inputbox.InputBox("Qual é a mensagem do Commit ?", "Commit", "Mensagem Commit");
// textBox1.Text = "Escreva o caminho de origem da pasta:";
Process proc = Process.Start(startInfo);
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardInput = true;
// not like this
// proc.WaitForExit();
// using (StreamReader sr = new StreamReader(@"C:'wamp'bin'php'php5.4.3'log.txt"))
// {
// textBox1.Text = sr.ReadToEnd();
// }
// add handler
// this will "assign" a function (proc_OutputDataReceived - you can change name)
// that will be called when proc.OutputDataReceived event will occur
// for that kind of event - you have to use DataReceivedEventHandler event type
proc.OutputDataReceived += new DataReceivedEventHandler(proc_OutputDataReceived);
// event handler function (outside function that you pasted)
// this function is assigned to proc.OutputDataReceived event
// by code with "+= new..."
// "sender" is an object in which event occured (when it occurs - "proc" will be available as "sender" here)
// "e" is an object with event parameters (data sent from process and some more)
public void proc_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
// cast "sender" to Process type
// "sender" is Process, but it has "object" type,
// you have to cast it to use .StandardInput.WriteLine() on "sender"
Process callerProcess = (Process)sender;
MessageBox.Show(e.Data); // this will show text that process sent
MessageBox.Show(e.Data.ToString()); // you may need to add ToString(), im not sure
if (e.Data.StartsWith("Revisao do Commit numero"))
{
MessageBox.Show("Process is talking something about Revisao numero"); // :)
callerProcess.StandardInput.WriteLine("Yes! Numero!"); // reply "Yes! Numero!" to process
}
}
如果更有经验的人在我的代码中看到一些错误 - 如果可以的话,请修复它。我现在无法测试它。
稍后添加:
您不必使用文件并存储cmd输出。可以使用事件直接读取进程输出。