기본 값을 변경하지 않고 DataGridView 셀 형식?
-
05-07-2019 - |
문제
Unbound DataGridView (vs 2008)가 있는데, 그 중 하나의 열에 파일 경로가 포함되어 있습니다. 실제로 기본 값을 수정하지 않고 ColumnWidthChanged 이벤트에서 Textrenderer 클래스를 사용하여 문자열을 포맷하고 싶습니다. 문제는 양식이 닫힐 때 테이블의 내용이 저장되고 형식 값을 저장하고 싶지 않다는 것입니다. 나는 명백한 해결책을보기에는 너무 깊이 있다고 생각합니다. 그래서 나는 당신들에게 그것을 지적 할 것입니다 :-).
아이디어는 이것을 표시하는 것입니다.
C : Program Files Microsoft Visual Studio 8 SDK v2.0 bin gacutil.exe
... 이것으로 (열의 너비에 따라) :
C : Program Files Microso… gacutil.exe
너무 빨리 말한 것 같습니다. Textrenderer.measuretext ()로부터 매우 이상한 결과를 얻고 있습니다. 경로 값을 "C : Documents and Settings Jluce My Documents Downloads"로 하드 코딩하면 "C : 문서 및 설정 jluce m ... 다운로드 0wnloads"로 끝납니다. t 하드 코드 IT (아래와 같이) 열을 크기를 조정할 때마다 더욱 손상됩니다.
부부가 크기를 조정 한 후 다음은 다음과 같습니다.스크린 샷
내가 현재하고있는 일은 다음과 같습니다.
if (e.ColumnIndex == 1)
{
foreach (DataGridViewRow Row in mappingsDataGrid.Rows)
{
string Path = (string)Row.Cells[1].Value;
Path = Path.Trim();
TextRenderer.MeasureText(Path, e.CellStyle.Font,
new Size(mappingsDataGrid.Columns[e.ColumnIndex].Width, Row.Height),
TextFormatFlags.ModifyString | TextFormatFlags.PathEllipsis);
e.Value = Path;
}
}
이것은 단지 계속 이상해지고 있습니다 !!
나는 각 숯을 반복하고 나쁜 것들을 제거함으로써 엉망인 끈의 문제를 해결했습니다. 그러나 이제는 더 미친 문제가 있습니다. 이벤트 핸들러에서 할당중인 로컬 변수는 통화 간의 값을 유지합니다.
관련 코드는 다음과 같습니다.
string Path = ""; // <-- #1
Path = "C:\\Documents and Settings\\jluce\\My Documents\\Downloads"; // <-- #2
TextRenderer.MeasureText(Path, Row.Cells[1].Style.Font,
new Size((mappingsDataGrid.Columns[e.Column.Index].Width), Row.Height),
TextFormatFlags.ModifyString | TextFormatFlags.PathEllipsis);
// Left out code that strips invalid chars
Row.Cells[1].Value = Path; // <-- #3
Path = null;
열 크기 조정 열 (위의 주석에서 #을 참조) :
- 이 라인 경로 후에 "" "가 포함됩니다.
- 이 라인 경로 후에는 위에 표시된대로 문자열이 포함되어 있습니다.
- 경로에는 잘린 파일 경로가 포함되어야합니다 (예 : "C : Documents and Setti ... 다운로드")
두 번째로 크기 조정 :
- 이 라인 경로 후에는 ""를 포함합니다.
- 이 라인 경로 후에 "c : documents and set ... downloads 0 documents downloads"가 포함되어 있습니다. 이는 유효하지 않은 문자를 제거하기 전에 이전 반복의 잘못된 값이었습니다 (여기서 ' 0'으로 표시)! !
- 이제 나사로 끈으로 시작했고 계속 악화되기 때문에 경로는 Fubar입니다.
값을 명시 적으로 할당 할 때 이전 함수 호출 (빈 문자열을 올바르게 할당 한 후)에서 유효하지 않은 값을 지정하는 이유는 무엇입니까? !!!!!
해결책
TextRenderer.MeasureText
방법은 a입니다 불쾌한 사람 - 전달 된 실제 문자열을 매개 변수로 변경하므로 DatagridView에서 참조 한 실제 문자열을 변경합니다. 실제로 .NET 문자열을 만듭니다 변하기 쉬운.
또한이 말도 안되는 방법은 실제를 바꾸지 않는 것 같습니다. Length
문자열의 경우, 단지 문자 중 하나를 \0
문자열의 끝을 나타냅니다 (일반 C의 널 종료 된 문자열과 같은). 그것은 재미있는 것들입니다!
이것은 앱의 안정성에 심각한 영향을 줄 수 있습니다. .NET가 사용하는 것을 고려한 경우 문자열 인턴, 문자열 상수가 더 이상 일정하지 않다는 것을 알았으므로 모든 종류의 이상한 결과를 얻을 수 있습니다.
첫 번째 단계는 문자열 사본을 만드는 것입니다 (동일한 문자의 새 인스턴스).
string Path = String.Copy(e.Value as string ?? "");
대신에
string Path = (string)Row.Cells[1].Value;
이것은 무엇이든 상관없이 보장 할 것입니다 TextRenderer
원래 문자열은 변경되지 않습니다.
그런 다음 수정 된 문자열에서 Null-Character를 제거해야합니다.
이것을함으로써 :
if (Path.IndexOf('\0') >= 0)
e.Value = Path.Substring(0, Path.IndexOf('\0'));
else
e.Value = Path;
깨끗하고 수정 된 문자열의 새 인스턴스를 만듭니다 (임시를 떠나십시오. Path
쓰레기 수집에 대해 참조되지 않은 복사).
다른 팁
인쇄하기 전에 주어진 값을 변경하려면 CellFormatting 이벤트를 사용해야합니다 (원래 객체 값이 수정되지 않음). 귀하의 경우 E.ColumnIndex 변수를 확인하여 올바른 열인지 확인하고 아래에서와 같이 e.Value 텍스트를 변경할 수 있습니다.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.DataSource = new List<Person>(new Person[] { new Person() { Name = "André", Adress = "Brazil" } });
}
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
e.Value = e.Value + " modified";
}
}
class Person
{
public String Name { get; set; }
public String Adress { get; set; }
}