|
Because the syntax you have to use to split on string(s) rather than character(s) is so damn clumsy:
string[] parts = input.Split(new string[] { " Is " }, StringSplitOptions.None);
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
Fair point... There is a rather obvious overload missing.
Regards,
Rob Philpott.
|
|
|
|
|
When you split the string, are you wanting to split it so that "Is" is the start of the phrase or end of one?
|
|
|
|
|
try this
string s="test1 ali test2 ali";
string[] parts = s.Replace("ali", "/").Split('/');
|
|
|
|
|
And what happens when s contains "the bestiality displayed by the main character, Ali, suggests that there is a causality at stake here"?
|
|
|
|
|
static void Main(string[] args)
{
String s = "aaa ali jskdfhskjdfhk ali sjkhfkjsfhkjsdh ali";
var regex = new Regex("ali", RegexOptions.IgnoreCase);
var s1 = regex.Replace(s, "/");
string[] parts = s1.Split('/');
for (int i = 0; i < parts.Length; i++)
Console.WriteLine(parts[i]);
Console.ReadLine();
}
|
|
|
|
|
Nope, that's still wrong. Seriously, try it out with the sentence I gave you. There's only one occurrence of the word Ali in that sentence, but "ali" appears as a substring in other words. So, you should only get two phrases - your version returns 4 and you are corrupting the string so characters are being removed.
|
|
|
|
|
Message Closed
modified 18-Mar-15 8:36am.
|
|
|
|
|
You seem to be confusing me with the original poster. My string was "the bestiality displayed by the main character, Ali, suggests that there is a causality at stake here". Try that one.
|
|
|
|
|
Now i got you, please try bellow
static void Main(string[] args)
{
String s = "the bestiality displayed by the main character, Ali, suggests that there is a causality at stake here";
string pattern = @"\bali\b";
string replace = "/";
var s1 = Regex.Replace(s, pattern, replace, RegexOptions.IgnoreCase);
string[] parts = s1.Split('/');
for (int i = 0; i < parts.Length; i++)
Console.WriteLine(parts[i]+ i.ToString());
Console.ReadLine();
}
|
|
|
|
|
Using the Regex.Split method[^] (as OG suggested[^]) is a better solution:
string input = "the bestiality displayed by the main character, Ali, suggests that there is a causality at stake here";
string pattern = @"\bali\b";
string[] parts = Regex.Split(input, pattern, RegexOptions.IgnoreCase);
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
|
http://stackoverflow.com/questions/6025560/how-to-ignore-case-in-string-replace
|
|
|
|
|
I'm trying to generate a simple report based on this article : www.dotnetawesome.blogspot.com/2013/09/microsoft-report-in-mvc-4.html[^]
Here is my controller
public ActionResult Report(string id)
{
LocalReport lr = new LocalReport();
string path = Path.Combine(Server.MapPath("~/Report"), "Person.rdlc");
if (System.IO.File.Exists(path))
{
lr.ReportPath = path;
}
else
{
return View("Index");
}
List<Person> cm = new List<Person>();
var viewModel = new PersonIndexData();
viewModel.People= db.Person
.Include(k => k.Groups)
.OrderBy(k => k.Name);
cm = viewModel.People.ToList();
ReportDataSource rd = new ReportDataSource("PersonDataSet", cm);
lr.DataSources.Add(rd);
string reportType = id;
string mimeType;
string encoding;
string fileNameExtension;
string deviceInfo =
"<DeviceInfo>" +
" <OutputFormat>" + id + "</OutputFormat>" +
" <PageWidth>8.5in</PageWidth>" +
" <PageHeight>11in</PageHeight>" +
" <MarginTop>0.5in</MarginTop>" +
" <MarginLeft>1in</MarginLeft>" +
" <MarginRight>1in</MarginRight>" +
" <MarginBottom>0.5in</MarginBottom>" +
"</DeviceInfo>";
Warning[] warnings;
string[] streams;
byte[] renderedBytes;
renderedBytes = lr.Render(
reportType,
deviceInfo,
out mimeType,
out encoding,
out fileNameExtension,
out streams,
out warnings);
return File(renderedBytes, mimeType);
}
When I type (mysite/person/report/pdf), I get this exception :
An error occurred during report processing. At this part :
renderedBytes = lr.Render(
reportType,
deviceInfo,
out mimeType,
out encoding,
out fileNameExtension,
out streams,
out warnings);
Can you tell me how I can get rid of the error? Thanks.
|
|
|
|
|
Hi i have recently moved into IT at work and am having to learn C# from scratch as fast as possible with little help. As practise I have to create a notepad clone in VS 2010 using c#. I know that using a 'RichTextBox' would be alot easier but i HAVE to use a 'Textbox' for my first version.
I have completed all the usual menu functions on the main form (form1) up to Find/Find Next/Replace. This is where i am a little stuck.
I have created a 2nd form(frmfind) to be the dialog box that appears when you click file->Find and i have coded enough that when you click on file frmfind appears but now i am not sure how to get form1 to take the search text entered and make it actually search my textBox1 and highlight the first found word etc. I am a visual learner so examples really help.
I have been told that using a for loop is the best option.
Here is my code i have not included the other file menu parts.
Form1
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Drawing.Printing;
namespace SamsNotePad
{
public partial class Form1 : Form
{
frmFind FindForm = new frmFind();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
FindForm.FindClicked +=new frmFind.FindClickEventHandler(FindForm_FindClicked);
}
private void findToolStripMenuItem_Click(object sender, EventArgs e)
{
FindForm.Show();
FindForm.Focus();
}
void FindForm_FindClicked(string strToFind)
{
int index = textBox1.Text.IndexOf(strToFind);
if (index >= 0)
{
textBox1.SelectionStart = index;
textBox1.SelectionLength = strToFind.Length;
textBox1.Focus();
}
}
private void findNextToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void replaceToolStripMenuItem_Click(object sender, EventArgs e)
{
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace SamsNotePad
{
public partial class frmFind : Form {
public frmFind()
{
InitializeComponent();
}
public string strToFind
{
get { return searchTxt.Text; }
}
public delegate void FindClickEventHandler(string strToFind);
public event FindClickEventHandler FindClicked;
void cancel_Click(object sender, EventArgs e)
{
this.Close();
}
private void cmdFind_Click(object sender, EventArgs e)
{
FindClicked(searchTxt.Text);
}
private void strToFind_TextChanged(object sender, EventArgs e)
{
}
}
}
modified 17-Mar-15 6:25am.
|
|
|
|
|
First things first: you need to show your dialog (using myFindWhatForm.ShowDialog) and then fetch the text to search for using a property of the dialog form to return it.
Then you can use string.IndexOf[^] to locate the first instance of the string in the Text property of the TextBox.
When you have the index, that's the first character you want to highlight, and the length of the search text is the number of characters to highlight.
Highlighting is easy:
int index = myEditTextBox.Text.IndexOf(searchForText);
if (index >=0)
{
myEditTextBox.SelectionStart = index;
myEditTextBox.SelectionLength = searchForText.Length;
myEditTextBox.Focus();
} If you don't set the focus to the textbox, you probably wont see the highlight - it'll be focussed on the "Find" button.
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
Thank you for such a good reply. When i run my code and type in a search word in the Find box and then click Find nothing is happening and the below code(FindClicked(searchTxt.Text);) on the frmfind is being highlighted with the following message 'Object reference not set to an instance of an object' any ideas where i am going wrong. I will edit my original code above to show what it now looks like after your suggestion.
private void cmdFind_Click(object sender, EventArgs e)
{
FindClicked(searchTxt.Text);
}
|
|
|
|
|
You need to store the content of serchTxt.Text in a member variable of the find form. Give this variable a property with a public getter. Then set the DialogResult of the find form to OK and close the form. This could look something like this:
private void cmdFind_Click(object Sender, EventArgs e)
{
storedText = searchTxt.Text;
this.DialogResult = DialogResult.OK;
Close();
}
Then the control is returnd to the function that called ShowDialog() in the original form. There you can get the search text from the find form variable (that you called ShowDialog() for) using the above mentioned property. Once you have the text, you can search for it, possibly using an extra function, on the original form.
Also you should check the DialogResult of the find form after the ShowDialog() returned. If it is OK, the user clicked Find. If it isn't, the user probably canceled the search form.
The good thing about pessimism is, that you are always either right or pleasently surprised.
|
|
|
|
|
Right...you need to think about this a bit...
You have FindForm_FindClicked set up as an event handler:
private void Form1_Load(object sender, EventArgs e)
{
FindForm.FindClicked +=new frmFind.FindClickEventHandler(FindForm_FindClicked);
}
But when you look at the definition of the method:
void FindForm_FindClicked(string strToFind)
{
...
}
You haven't given it the right signature for an event handler - so it shouldn't compile, it should give a "No overload for ...." error.
Unless you have decided to pass the string directly from your event instead of the standard event signature, which is a poor idea - you really should pass the form instance, and event args (and use a custom event args if need really must pass more info at that time)
You would then use the form instance to access the search string:
private void FindForm_FindClicked(object sender, EventArgs e)
{
frmFind finder = sender as frmFind;
if (finder != null)
{
string strSearch = finder.SearchString;
...
}
} Where SearchString is a property of the frmFind form class that returns the user input.
Make sense?
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
You've received some good advice on this thread; I'd like to point you to a slightly different type of solution. In looking at communication between object-instances, I try to think in terms of what I call "POEM" which is my half-serious anagram for expressing the idea of "Principle of Expose the Minimum."
In your scenario, I see the only real "need to know" is: the Form with the Text you want to search and highlight (the Main Form, I assume) needs to know what the user entered as search text in your second Form.
I would choose what I see as the simple strategy of having one Property on the SearchForm with a private 'set and public 'get that exposes the text the end-user entered, and I'd show the SearchForm modally using 'ShowDialog, "doing the right thing" when the end-user clicked 'Cancel, or 'Search Buttons:
public string TextToFind { private set; get; }
private void btnCancel_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
this.Close();
}
private void btnFind_Click(object sender, EventArgs e)
{
TextToFind = textBox1.Text;
if (String.IsNullOrWhiteSpace(TextToFind))
{
MessageBox.Show("Searching on white space makes not sense.");
return;
}
this.DialogResult = DialogResult.OK;
this.Close();
} To use this, I would declare one instance of the SearchForm in the Main Form, and re-use it like this:
private void Search_Click(object sender, EventArgs e)
{
if (SearchForm1.ShowDialog() == DialogResult.OK)
{
string searchText = SearchForm1.TextToFind;
int ndx = TheTextBox.Text.IndexOf(searchText);
if (ndx == -1) return;
TheTextBox.SelectionStart = ndx;
TheTextBox.SelectionLength = searchText.Length;
}
} From my point-of-view this strategy keeps the search Form "as dumb a robot as possible," and that is a good thing
«To kill an error's as good a service, sometimes better than, establishing new truth or fact.» Charles Darwin in "Prospero's Precepts"
|
|
|
|
|
Thank you for your detailed example i have adapted my code as below but the word string is underlined in red stating an Embedded statement cannot be a declaration or labeled statement.....
if (FindForm.ShowDialog() == DialogResult.OK)
string searchText = FindForm.strToFind;
Here is what i have at the moment (I have not included all my other file menu items.)
Form1 (my Notepad)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Drawing.Printing;
namespace SamsNotePad
{
public partial class Form1 : Form
{
frmFind FindForm = new frmFind();
public Form1()
{
InitializeComponent();
}
private void findToolStripMenuItem_Click(object sender, EventArgs e)
{
if (FindForm.ShowDialog() == DialogResult.OK)
string searchText = FindForm.strToFind;
int ndx = textBox1.Text.IndexOf(searchText);
if (ndx == -1) return;
textBox1.SelectionStart = ndx;
textBox1.SelectionLength = searchText.Length;
}
private void findNextToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void replaceToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void goToToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void selectAllToolStripMenuItem_Click(object sender, EventArgs e)
{
textBox1.SelectAll();
}
private void timeDateToolStripMenuItem_Click(object sender, EventArgs e)
{
textBox1.Text += DateTime.Now;
}
private void statusToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void wordWrapToolStripMenuItem_Click(object sender, EventArgs e)
{
wordWrapToolStripMenuItem.Checked = !(wordWrapToolStripMenuItem.Checked); textBox1.WordWrap = wordWrapToolStripMenuItem.Checked;
}
private void fontToolStripMenuItem_Click(object sender, EventArgs e)
{
if (fontDialog1.ShowDialog() == DialogResult.OK)
textBox1.Font = fontDialog1.Font;
}
public string strToFind { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace SamsNotePad
{
public partial class frmFind : Form
{
public frmFind()
{
InitializeComponent();
}
public string strToFind {private set; get; }
private void Cancel_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
this.Close();
}
private void cmdFind_Click(object sender, EventArgs e)
{
strToFind = searchTxt.Text;
if (string.IsNullOrWhiteSpace(strToFind))
{
MessageBox.Show("Please enter search text");
return;
}
this.DialogResult = DialogResult.OK;
this.Close();
}
}
}
|
|
|
|
|
Hi sorry last reply was just me needing to add the curly braces in after the if statement.
But i just need to now try and stop the FrmFind from closing when i click Find Next as want to be able to search for the next instance of the word. Any ideas????
|
|
|
|
|
Member 11531487 wrote: when i click Find Next as want to be able to search for the next instance of the word. Hi, if you are not going to close the Form, and want to implement 'Select Next, then using 'ShowDialog is obviously not the right solution here.
One thing to think about: what if you do close the Form, but then, on the Main Form you define a special key-combination to "search next" ?
I will respond further within 18 hours.
cheers, Bill
«To kill an error's as good a service, sometimes better than, establishing new truth or fact.» Charles Darwin in "Prospero's Precepts"
|
|
|
|
|
I think there's a simple way to keep the search form open, and re-use it to find the next instance of a string. I would implement this by injecting a simple Action Delegate instance into the instance of the SearchForm at run-time (this is just a shortcut for creating a custom event; see the note at the end, here, for why I prefer this syntax):
public partial class SearchForm : Form
{
public SearchForm()
{
InitializeComponent();
}
public Action<string, bool> FindAction;
private string LastSearchText;
private string TextToFind;
private void btnCancel_Click(object sender, EventArgs e)
{
this.Hide();
}
private void btnFind_Click(object sender, EventArgs e)
{
TextToFind = textBox1.Text;
if (String.IsNullOrWhiteSpace(TextToFind))
{
MessageBox.Show("Searching on white space makes not sense.");
return;
}
FindAction(TextToFind, LastSearchText == TextToFind);
LastSearchText = TextToFind;
}
} When 'FindAction is invoked, it passes both the text the user wishes to search for, and a boolean flag that indicates whether the search is a new search, or a repeat of the previous search.
In the body of the Main Form:
SearchForm searchForm = new SearchForm();
private void Form1_Load(object sender, EventArgs e)
{
searchForm.Visible = false;
searchForm.Owner = this;
searchForm.FindAction = FindAction;
}
private void FindAction(string textToFind, bool isSameSearch)
{
int searchStartIndex = (isSameSearch)
? textBox1.SelectionStart + textBox1.SelectionLength
: 0;
int ndx = textBox1.Text.IndexOf(textToFind, searchStartIndex);
if (ndx == -1) return;
{
textBox1.SelectionStart = ndx;
textBox1.SelectionLength = textToFind.Length;
}
}
private void ShowSearchForm_Click(object sender, EventArgs e)
{
searchForm.Show();
} Notes:
1. You may wish to change the logic used here so that the search always begins at the current insertion point in the text ... where the cursor is ... rather than starting from the beginning ?
2. Why I prefer using an Action (or Func) delegate instance for "callbacks:"
a. while both Action and Func Types are "full-fledged" Delegate Types which can have multiple subscribers, with subscribers added and removed using the += and -= syntax:
b. when my intent is to use a delegate only as a callback in one specific "role" ... i.e., not to make the delegate available in a wider scope for use/subscription ... I think it more clearly expresses that intent to use Action/Func, and directly assign the callback function using = rather than +=.
Note that other folks may have other (strong) opinions about such a usage pattern with Action and Func.
«To kill an error's as good a service, sometimes better than, establishing new truth or fact.» Charles Darwin in "Prospero's Precepts"
|
|
|
|
|
Hi again your response is excellent as always the original code you sent me did indeed highlight the chosen word perfectly but now i have changed it to your most recent suggestion it is stopped at the line
FindAction(strToFind, LastSearchText == strToFind);
stating 'Object reference not set to an instance of an object.'
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace SamsNotePad
{
public partial class frmFind : Form
{
public frmFind()
{
InitializeComponent();
}
public Action<string, bool> FindAction;
private string LastSearchText;
private string strToFind;
private void Cancel_Click(object sender, EventArgs e)
{
this.Hide();
}
private void cmdFind_Click(object sender, EventArgs e)
{
strToFind = searchTxt.Text;
if (string.IsNullOrWhiteSpace(strToFind))
{
MessageBox.Show("Please enter search text");
return;
}
FindAction(strToFind, LastSearchText == strToFind);
LastSearchText = strToFind;
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Drawing.Printing;
namespace SamsNotePad
{
public partial class Form1 : Form
{
frmFind FindForm = new frmFind();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
FindForm.Visible = false;
FindForm.Owner = this;
FindForm.FindAction = findAction;
}
private void findAction(string strToFind, bool isSameSearch)
{
int searchStartIndex = (isSameSearch)
? textBox1.SelectionStart + textBox1.SelectionLength : 0;
int ndx = textBox1.Text.IndexOf(strToFind, searchStartIndex);
if (ndx == -1) return;
textBox1.SelectionStart = ndx;
textBox1.SelectionLength = strToFind.Length;
}
private void findToolStripMenuItem_Click(object sender, EventArgs e)
{
FindForm.Show();
}
private void findNextToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void replaceToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void goToToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void selectAllToolStripMenuItem_Click(object sender, EventArgs e)
{
textBox1.SelectAll();
}
private void timeDateToolStripMenuItem_Click(object sender, EventArgs e)
{
textBox1.Text += DateTime.Now;
}
private void statusToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void wordWrapToolStripMenuItem_Click(object sender, EventArgs e)
{
wordWrapToolStripMenuItem.Checked = !(wordWrapToolStripMenuItem.Checked); textBox1.WordWrap = wordWrapToolStripMenuItem.Checked;
}
private void fontToolStripMenuItem_Click(object sender, EventArgs e)
{
if (fontDialog1.ShowDialog() == DialogResult.OK)
textBox1.Font = fontDialog1.Font;
}
public Action<string, bool> FindAction { get; set; }
}
}
|
|
|
|
|