C # का उपयोग करके पाठ में एक टैब वर्ण सम्मिलित करना


283

मैं एक आवेदन जहाँ मैं कई मान कैप्चर और उनके साथ एक पाठ बनाने चाहिए निर्माण कर रहा हूँ: Name, Age, आदि

आउटपुट में एक सादा पाठ होगा TextBox

मैं उन सूचनाओं को इस तरह पेश करने की columnsकोशिश कर रहा हूं, इसलिए मैं उन्हें अलग करने की कोशिश कर रहा हूं tabताकि यह स्पष्ट हो सके।

उदाहरण के लिए, होने के बजाय:

Ann 26
Sarah 29
Paul 45

मैं यह दिखाना चाहूंगा:

एन टैब 26 सारा टैब 29 पॉल टैब 45

कैसे करें कोई टिप insert मेरे पाठ में टैब ?


चेतावनी का एक शब्द ..... यदि नाम फ़ील्ड की लंबाई बहुत लंबी है, तो भी आप उन्हें संरेखित नहीं करेंगे। "एन" केवल 3 वर्ण है। "यिर्मयाह" है 8. "ऐन" में जोड़ा गया एक एकल टैब ## को जेरेमिया के अंत से पहले प्रदर्शित कर सकता है। मैं वर्णों की संख्या के आधार पर सुझाव देना चाहूंगा। अंतरिक्ष से "स्प्लिट", 12 अक्षरों तक पहले सदस्य के लिए रिक्त स्थान जोड़ें, और "26" जोड़ें। यदि आपके पास एक नाम है जो 12 से अधिक हो सकता है, तो समायोजित करें
KeachyPeenReturns

मैं बस एक समाधान पोस्ट करने के बाद KeachyPeenReturns की टिप्पणी पढ़ता हूं। उनकी टिप्पणी सही है लेकिन उनका समाधान अपूर्ण है। BEST का उत्तर पहले से ही गलत है। कृपया इस प्रश्न के लिए मेरे समाधान को पढ़ने और स्थिति (BEST उत्तर) को अपडेट करने के लिए समय निकालें। आम तौर पर, मैं इस प्रकार की टिप्पणी नहीं करता हूं, लेकिन सवाल बहुत पुराना है।
schlebe

जवाबों:


460

\tअपने तार में चरित्र का उपयोग करने का प्रयास करें


445

हज़ार उसके साथ सही है \t। यहां C # के लिए भागने के पात्रों की पूरी सूची है:

\' एक उद्धरण के लिए।

\" एक दोहरे उद्धरण के लिए।

\\ बैकस्लैश के लिए।

\0 एक अशक्त चरित्र के लिए।

\a एक सतर्क चरित्र के लिए।

\b एक बैकस्पेस के लिए।

\f एक फार्म फ़ीड के लिए।

\n एक नई लाइन के लिए।

\r गाड़ी वापसी के लिए।

\t एक क्षैतिज टैब के लिए।

\v एक ऊर्ध्वाधर टैब के लिए।

\uxxxxएक यूनिकोड वर्ण हेक्स मान (जैसे \u0020) के लिए।

\xके रूप में ही है \u, लेकिन आप अग्रणी शून्य (जैसे \x20) की जरूरत नहीं है ।

\Uxxxxxxxx एक यूनिकोड वर्ण हेक्स मान (सरोगेट उत्पन्न करने के लिए लंबे समय तक आवश्यक रूप) के लिए।


8
आपको यह डेटा कहां से मिला? मैं अपने संदर्भ के लिए जानना चाहूंगा।
कतार हैमर

@Queue Hammer ने खुद को जॉन स्कीट के साथ रोमांस किया, ऐसा लगता है ... devblogs.microsoft.com/csharpfaq/…
लियोनार्ड एबी

74

यह भी उपयोग करने के लिए उपयोगी हो सकता है String.Format, जैसे

String.Format("{0}\t{1}", FirstName,Count);

17
यह सबसे अच्छा जवाब है क्योंकि कोड एक लाइनर और लंबी स्पष्टीकरण से अधिक समय तक बोलता है।
फिल


2

इसे करने के कई तरीके हैं। सबसे सरल \tआपके पाठ में उपयोग हो रहा है। हालांकि, यह संभव है कि \tकुछ स्थितियों में काम नहीं करता है, जैसे कि PdfReportनगेट पैकेज।


4
यह उस मामले में एक टैब जोड़ने के बारे में जानकारी जोड़ने के लिए उपयोगी होगा जहां \tकाम नहीं करता है। ;)
जे। स्कॉट एल्बलिन

2

का उपयोग करना Microsoft Winform controls, आपकी समस्या को हल करने के लिए थोड़ा सा वर्कअराउंड के बिना हल करना असंभव है जो मैं नीचे बताऊंगा।

संकट

बस का उपयोग करने में समस्या "\t"या vbTabकि जब एक से अधिक पाठ बॉक्स प्रदर्शित होता है और कर रहे हैं कि संरेखण सभी पाठ बॉक्स, केवल के लिए सम्मान किया जाना चाहिए है "\t"याvbTab समाधान कुछ है कि नहीं है हमेशा सही ढंग से गठबंधन को प्रदर्शित करेगा।

VB.Net में उदाहरण:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    TextBox1.Text = "Bernard" + vbTab + "32"
    TextBox2.Text = "Luc" + vbTab + "47"
    TextBox3.Text = "François-Victor" + vbTab + "12"
End Sub

प्रदर्शित करेगा

यहां छवि विवरण दर्ज करें

जैसा कि आप देख सकते हैं, ageमान François-Victorको दाईं ओर स्थानांतरित किया गया है और इसके साथ संरेखित नहीं किया गया हैage दो अन्य टेक्स्टबॉक्स के मूल्य के ।

उपाय

इस समस्या को हल करने के लिए, आपको एक विशिष्ट SendMessage()user32.dll एपीआई फ़ंक्शन का उपयोग करके टैब की स्थिति निर्धारित करनी चाहिए जैसा कि नीचे दिखाया गया है।

Public Class Form1

    Public Declare Function SendMessage _
        Lib "user32" Alias "SendMessageA" _
        ( ByVal hWnd As IntPtr _
        , ByVal wMsg As Integer _
        , ByVal wParam As Integer _
        , ByVal lParam() As Integer _
        ) As Integer

    Private Const EM_SETTABSTOPS As Integer = &HCB

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim tabs() As Integer = {4 * 25}

        TextBox1.Text = "Bernard" + vbTab + "32"
        SendMessage(TextBox1.Handle, EM_SETTABSTOPS, 1, tabs)
        TextBox2.Text = "Luc" + vbTab + "47"
        SendMessage(TextBox2.Handle, EM_SETTABSTOPS, 1, tabs)
        TextBox3.Text = "François-Victor" + vbTab + "12"
        SendMessage(TextBox3.Handle, EM_SETTABSTOPS, 1, tabs)
    End Sub

End Class

और निम्नलिखित प्रपत्र प्रदर्शित किया जाएगा

यहां छवि विवरण दर्ज करें

आप देख सकते हैं कि अब, सभी मान सही ढंग से संरेखित हैं :-)

टिप्पणियों

MultilineTextBox की संपत्ति True पर सेट होनी चाहिए । यदि यह गुण गलत पर सेट है, तो टैब पहले की तरह स्थित है।

AcceptsTabसंपत्ति कैसे दी जाती है यह महत्वपूर्ण नहीं है (मैंने परीक्षण किया है)।

इस सवाल का स्टैकऑवरफ्लो पर पहले ही इलाज किया जा चुका है

सावधानी: टैब स्थिति के लिए मेसुर यूनिट चरित्र नहीं है, लेकिन ऐसा कुछ है जो चरित्र का 1/4 प्रतीत होता है। यही कारण है कि मैं लंबाई 4 से गुणा करता हूं।

C # समाधान

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        private static extern IntPtr SendMessage(IntPtr h, int msg, int wParam, uint[] lParam);
        private const int EM_SETTABSTOPS = 0x00CB;
        private const char vbTab = '\t';

        public Form1()
        {
            InitializeComponent();

            var tabs = new uint[] { 25 * 4 };

            textBox1.Text = "Bernard" + vbTab + "32";
            SendMessage(textBox1.Handle, EM_SETTABSTOPS, 1, tabs);
            textBox2.Text = "Luc" + vbTab + "47";
            SendMessage(textBox2.Handle, EM_SETTABSTOPS, 1, tabs);
            textBox3.Text = "François-Victor" + vbTab + "12";
            SendMessage(textBox3.Handle, EM_SETTABSTOPS, 1, tabs);
        }
    }
}

1
string St = String.Format("{0,-20} {1,5:N1}\r", names[ctr], hours[ctr]);
richTextBox1.Text += St;

यह अच्छी तरह से काम करता है, लेकिन आपके पास एक मोनो-स्पॉन्टेड फ़ॉन्ट होना चाहिए।


1

शाब्दिक तार (@ के साथ शुरू) का उपयोग करते समय यह आसान हो सकता है

char tab = '\u0009';
string A = "Apple";
string B = "Bob";
string myStr = String.Format(@"{0}:{1}{2}", A, tab, B);

में परिणाम होगा Apple:<tab>Bob


1

ऊपर awsers के अलावा आप PadLeft या PadRight का उपयोग कर सकते हैं:

string name = "John";
string surname = "Smith";

Console.WriteLine("Name:".PadRight(15)+"Surname:".PadRight(15));
Console.WriteLine( name.PadRight(15) + surname.PadRight(15));

यह स्ट्रिंग में बाईं या दाईं ओर रिक्त स्थान भर देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.